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

Richard W.M. Jones
2014-04-25T19:58:24Z

On Thu, Apr 24, 2014 at 04:43:59PM -0600, Mike Latimer
wrote:
> 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.

Sorry for the late reply, but I've been buried in the v2v rewrite for
the past few days.  I will take this patch into account when I get
back to the Linux conversion part.

Thanks,
Rich.

> ---
>  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
>
> _______________________________________________
> Libguestfs mailing list
> Libguestfs@redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs

--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.