Andrey Drobyshev
2022-Apr-25 19:35 UTC
[Libguestfs] [PATCH] appliance: don't read extfs signature from QCOW2 image directly
If the appliance is a QCOW2 image, function get_root_uuid_with_file() fails to read ext filesystem signature (0x53EF at offset 0x438) from it. This results in the following error: libguestfs: error: /usr/lib64/guestfs/appliance/root: appliance is not an extfs filesystem The error itself is harmless, but misleading. So let's skip retrieving the signature and UUID in case the image contains QCOW2 header. It's safe because in this case we'll retrieve it later from RAW image dumped from that QCOW2 by "qemu-img dd". Signed-off-by: Andrey Drobyshev <andrey.drobyshev at virtuozzo.com> --- lib/appliance-kcmdline.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/appliance-kcmdline.c b/lib/appliance-kcmdline.c index 8b78655eb..092d37329 100644 --- a/lib/appliance-kcmdline.c +++ b/lib/appliance-kcmdline.c @@ -65,7 +65,7 @@ static char * get_root_uuid_with_file (guestfs_h *g, const char *appliance) { - unsigned char magic[2], uuid[16]; + unsigned char magic[4], uuid[16]; char *ret; int fd; @@ -74,6 +74,10 @@ get_root_uuid_with_file (guestfs_h *g, const char *appliance) perrorf (g, _("open: %s"), appliance); return NULL; } + if (read (fd, magic, 4) != 4 || !strncmp ((char *) magic, "QFI\xfb", 4)) { + /* No point looking for extfs signature in QCOW2 directly. */ + return NULL; + } if (lseek (fd, 0x438, SEEK_SET) != 0x438) { magic_error: error (g, _("%s: cannot read extfs magic in superblock"), appliance); -- 2.35.1
Richard W.M. Jones
2022-Apr-25 19:59 UTC
[Libguestfs] [PATCH] appliance: don't read extfs signature from QCOW2 image directly
On Mon, Apr 25, 2022 at 10:35:47PM +0300, Andrey Drobyshev wrote:> If the appliance is a QCOW2 image, function get_root_uuid_with_file() > fails to read ext filesystem signature (0x53EF at offset 0x438) from it. > This results in the following error: > > libguestfs: error: /usr/lib64/guestfs/appliance/root: appliance is not > an extfs filesystem > > The error itself is harmless, but misleading. So let's skip retrieving > the signature and UUID in case the image contains QCOW2 header. It's > safe because in this case we'll retrieve it later from RAW image dumped > from that QCOW2 by "qemu-img dd". > > Signed-off-by: Andrey Drobyshev <andrey.drobyshev at virtuozzo.com>Thanks Andrey, I've pushed it. Rich.> lib/appliance-kcmdline.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/lib/appliance-kcmdline.c b/lib/appliance-kcmdline.c > index 8b78655eb..092d37329 100644 > --- a/lib/appliance-kcmdline.c > +++ b/lib/appliance-kcmdline.c > @@ -65,7 +65,7 @@ > static char * > get_root_uuid_with_file (guestfs_h *g, const char *appliance) > { > - unsigned char magic[2], uuid[16]; > + unsigned char magic[4], uuid[16]; > char *ret; > int fd; > > @@ -74,6 +74,10 @@ get_root_uuid_with_file (guestfs_h *g, const char *appliance) > perrorf (g, _("open: %s"), appliance); > return NULL; > } > + if (read (fd, magic, 4) != 4 || !strncmp ((char *) magic, "QFI\xfb", 4)) { > + /* No point looking for extfs signature in QCOW2 directly. */ > + return NULL; > + } > if (lseek (fd, 0x438, SEEK_SET) != 0x438) { > magic_error: > error (g, _("%s: cannot read extfs magic in superblock"), appliance); > -- > 2.35.1-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 100 libraries supported. http://fedoraproject.org/wiki/MinGW