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

Mike Latimer
2014-04-24T22:43:59Z

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