--- ./util/deviceiter.c.orig 2010-10-10 00:33:38.736290996 +0400 +++ ./util/deviceiter.c 2010-10-10 01:04:50.932290987 +0400 @@ -533,6 +533,10 @@ grub_util_iterate_devices (int NESTED_FU necessary. */ for (entry = readdir (dir); entry; entry = readdir (dir)) { + /* Skip . and .. entries */ + if ((! strcmp (entry->d_name, ".")) || + (! strcmp (entry->d_name, ".."))) + continue; /* Skip partition entries. */ if (strstr (entry->d_name, "-part")) continue; @@ -543,6 +547,10 @@ grub_util_iterate_devices (int NESTED_FU /* Skip RAID entries; they are handled by upper layers. */ if (strncmp (entry->d_name, "md-", sizeof ("md-") - 1) == 0) continue; + /* Skip absent devices and prevent compare_devices from crash */ + char *kernel = canonicalize_file_name (devs[devs_len].stable); + if (! kernel) + continue; if (devs_len >= devs_max) { devs_max *= 2; @@ -550,8 +558,7 @@ grub_util_iterate_devices (int NESTED_FU } devs[devs_len].stable = xasprintf ("/dev/disk/by-id/%s", entry->d_name); - devs[devs_len].kernel = - canonicalize_file_name (devs[devs_len].stable); + devs[devs_len].kernel = kernel; devs_len++; }