[Libguestfs] [PATCH] virt-v2v: Catch invalid initrd path

Mike Latimer mlatimer at suse.com
Thu Apr 24 22:43:59 UTC 2014


In some cases (specifically, SUSE grub2 environments) it is possible to
fail to update the block entries in device.map. In turn, this causes an
invalid path to be returned in perl-Bootloader code, which causes the
conversion to fail with the following message:

is_file_opts: is_file: is_file_stub: path must start with a / character

This patch prevents the problem by adding device.map (for /boot/grub and
/boot/grub2) to the list of configurations to remap, then adds a check
to ensure invalid paths are not passed to is_file_opts.

Note - This is for the existing (perl version) of virt-v2v.

---
 lib/Sys/VirtConvert/Converter/Linux.pm | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lib/Sys/VirtConvert/Converter/Linux.pm b/lib/Sys/VirtConvert/Converter/Linux.pm
index e8463bc..b673120 100644
--- a/lib/Sys/VirtConvert/Converter/Linux.pm
+++ b/lib/Sys/VirtConvert/Converter/Linux.pm
@@ -56,7 +56,10 @@ sub get_initrd
         if (defined($initrd)) {
             # If the initrd starts with (hdX,X), remove it.
             $initrd =~ s/^\(hd.*\)//;
-            return $initrd if ($g->is_file_opts($initrd, followsymlinks=>1));
+            # Catch invalid paths by ensuring first character is '/'
+            if ($initrd =~ /^\//) {
+                return $initrd if $g->is_file_opts($initrd, followsymlinks=>1);
+            }
         }
     }
 
@@ -2672,13 +2675,13 @@ sub _remap_block_devices
 
         # Add standard configuration files to the checklist
         push (@checklist, '/files/etc/fstab/*/spec');
+        push (@checklist, '/files/boot/*/device.map/*'.
+                          '[label() != "#comment"]');
 
         # Add grub or grub2 files to the checklist
         if (defined($grub->{grub_conf})) {
             push (@checklist, "/files$grub->{grub_conf}/*/kernel/root");
             push (@checklist, "/files$grub->{grub_conf}/*/kernel/resume");
-            push (@checklist, '/files/boot/grub/device.map/*'.
-                              '[label() != "#comment"]');
         }
         elsif (defined($grub->{cfg})) {
             push (@checklist, '/files/etc/sysconfig/grub/GRUB_CMDLINE_LINUX');
-- 
1.8.4.5




More information about the Libguestfs mailing list