diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 950fee6..e5b1018 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2794,23 +2794,30 @@ function _system_rebuild_module_data() {
 
   // Read info files for each module.
   foreach ($modules as $key => $module) {
+    $info_filepath = dirname($module->uri) . '/' . $module->name . '.info';
+    // Skip modules that don't provide info.
+    if (!is_file($info_filepath)) {
+      unset($modules[$key]);
+      continue;
+    }
     // The module system uses the key 'filename' instead of 'uri' so copy the
     // value so it will be used by the modules system.
     $modules[$key]->filename = $module->uri;
 
     // Look for the info file.
-    $module->info = drupal_parse_info_file(dirname($module->uri) . '/' . $module->name . '.info');
+    $module->info = drupal_parse_info_file($info_filepath);
 
-    // Add the info file modification time, so it becomes available for
-    // contributed modules to use for ordering module lists.
-    $module->info['mtime'] = filemtime(dirname($module->uri) . '/' . $module->name . '.info');
-
-    // Skip modules that don't provide info.
-    if (empty($module->info)) {
+    // Skip modules that don't set any information in the info file.
+    $info_required_keys = array('name' => '');
+    if (empty($module->info) || !array_intersect_key($module->info, $info_required_keys)) {
       unset($modules[$key]);
       continue;
     }
 
+    // Add the info file modification time, so it becomes available for
+    // contributed modules to use for ordering module lists.
+    $module->info['mtime'] = filemtime($info_filepath);
+
     // Merge in defaults and save.
     $modules[$key]->info = $module->info + $defaults;
 
