From a86c5a4fb486964fe72994c2b837956a4335ac6b Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 28 Jun 2024 10:10:57 +0100 Subject: [PATCH] Fix (rare) undetected truncation of 64 bit int results to 32 bits resolves: RHEL-45466 --- ...est-data-binaries-Remove-x-attribute.patch | 198 ++++++++++++++++++ ...ect-tests-Don-t-erase-error-messages.patch | 20 ++ ...arted-Assume-sfdisk-part-type-exists.patch | 125 +++++++++++ ...-Don-t-truncate-64-bit-results-from-.patch | 31 +++ libguestfs.spec | 10 +- 5 files changed, 383 insertions(+), 1 deletion(-) create mode 100644 0046-test-data-binaries-Remove-x-attribute.patch create mode 100644 0047-gobject-tests-Don-t-erase-error-messages.patch create mode 100644 0048-daemon-parted-Assume-sfdisk-part-type-exists.patch create mode 100644 0049-generator-daemon-Don-t-truncate-64-bit-results-from-.patch diff --git a/0046-test-data-binaries-Remove-x-attribute.patch b/0046-test-data-binaries-Remove-x-attribute.patch new file mode 100644 index 0000000..8d8a4d1 --- /dev/null +++ b/0046-test-data-binaries-Remove-x-attribute.patch @@ -0,0 +1,198 @@ +From 69f567363a098654354e0be94adbf9c5f847a8e9 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 25 Apr 2024 12:56:48 +0100 +Subject: [PATCH] test-data/binaries: Remove +x attribute + +These binaries are not meant to be run, they are purely data files +used for testing. Remove the +x attribute to prevent accidentally +running them. + +However to avoid breaking the phony guests, we need to chmod +x the +files when we upload them into those guests. + +(cherry picked from commit 574a87f889c7b48b231fcabf0d45b88bd48b53f8) +--- + test-data/binaries/bin-aarch64-dynamic | Bin + test-data/binaries/bin-armv7-dynamic | Bin + test-data/binaries/bin-i586-dynamic | Bin + test-data/binaries/bin-ia64-dynamic | Bin + test-data/binaries/bin-mipsel-dynamic | Bin + test-data/binaries/bin-ppc64-dynamic | Bin + test-data/binaries/bin-ppc64le-dynamic | Bin + test-data/binaries/bin-riscv64-dynamic | Bin + test-data/binaries/bin-s390x-dynamic | Bin + test-data/binaries/bin-sparc-dynamic | Bin + test-data/binaries/bin-win32.exe | Bin + test-data/binaries/bin-win64.exe | Bin + test-data/binaries/bin-x86_64-dynamic | Bin + test-data/binaries/lib-aarch64.so | Bin + test-data/binaries/lib-armv7.so | Bin + test-data/binaries/lib-i586.so | Bin + test-data/binaries/lib-ia64.so | Bin + test-data/binaries/lib-mipsel.so | Bin + test-data/binaries/lib-ppc64.so | Bin + test-data/binaries/lib-ppc64le.so | Bin + test-data/binaries/lib-riscv64.so | Bin + test-data/binaries/lib-s390x.so | Bin + test-data/binaries/lib-sparc.so | Bin + test-data/binaries/lib-win32.dll | Bin + test-data/binaries/lib-win64.dll | Bin + test-data/binaries/lib-x86_64.so | Bin + test-data/phony-guests/make-archlinux-img.sh | 1 + + test-data/phony-guests/make-debian-img.sh | 1 + + test-data/phony-guests/make-fedora-img.pl | 1 + + test-data/phony-guests/make-ubuntu-img.sh | 1 + + 30 files changed, 4 insertions(+) + mode change 100755 => 100644 test-data/binaries/bin-aarch64-dynamic + mode change 100755 => 100644 test-data/binaries/bin-armv7-dynamic + mode change 100755 => 100644 test-data/binaries/bin-i586-dynamic + mode change 100755 => 100644 test-data/binaries/bin-ia64-dynamic + mode change 100755 => 100644 test-data/binaries/bin-mipsel-dynamic + mode change 100755 => 100644 test-data/binaries/bin-ppc64-dynamic + mode change 100755 => 100644 test-data/binaries/bin-ppc64le-dynamic + mode change 100755 => 100644 test-data/binaries/bin-riscv64-dynamic + mode change 100755 => 100644 test-data/binaries/bin-s390x-dynamic + mode change 100755 => 100644 test-data/binaries/bin-sparc-dynamic + mode change 100755 => 100644 test-data/binaries/bin-win32.exe + mode change 100755 => 100644 test-data/binaries/bin-win64.exe + mode change 100755 => 100644 test-data/binaries/bin-x86_64-dynamic + mode change 100755 => 100644 test-data/binaries/lib-aarch64.so + mode change 100755 => 100644 test-data/binaries/lib-armv7.so + mode change 100755 => 100644 test-data/binaries/lib-i586.so + mode change 100755 => 100644 test-data/binaries/lib-ia64.so + mode change 100755 => 100644 test-data/binaries/lib-mipsel.so + mode change 100755 => 100644 test-data/binaries/lib-ppc64.so + mode change 100755 => 100644 test-data/binaries/lib-ppc64le.so + mode change 100755 => 100644 test-data/binaries/lib-riscv64.so + mode change 100755 => 100644 test-data/binaries/lib-s390x.so + mode change 100755 => 100644 test-data/binaries/lib-sparc.so + mode change 100755 => 100644 test-data/binaries/lib-win32.dll + mode change 100755 => 100644 test-data/binaries/lib-win64.dll + mode change 100755 => 100644 test-data/binaries/lib-x86_64.so + +diff --git a/test-data/binaries/bin-aarch64-dynamic b/test-data/binaries/bin-aarch64-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-armv7-dynamic b/test-data/binaries/bin-armv7-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-i586-dynamic b/test-data/binaries/bin-i586-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-ia64-dynamic b/test-data/binaries/bin-ia64-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-mipsel-dynamic b/test-data/binaries/bin-mipsel-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-ppc64-dynamic b/test-data/binaries/bin-ppc64-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-ppc64le-dynamic b/test-data/binaries/bin-ppc64le-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-riscv64-dynamic b/test-data/binaries/bin-riscv64-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-s390x-dynamic b/test-data/binaries/bin-s390x-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-sparc-dynamic b/test-data/binaries/bin-sparc-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-win32.exe b/test-data/binaries/bin-win32.exe +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-win64.exe b/test-data/binaries/bin-win64.exe +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/bin-x86_64-dynamic b/test-data/binaries/bin-x86_64-dynamic +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-aarch64.so b/test-data/binaries/lib-aarch64.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-armv7.so b/test-data/binaries/lib-armv7.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-i586.so b/test-data/binaries/lib-i586.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-ia64.so b/test-data/binaries/lib-ia64.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-mipsel.so b/test-data/binaries/lib-mipsel.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-ppc64.so b/test-data/binaries/lib-ppc64.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-ppc64le.so b/test-data/binaries/lib-ppc64le.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-riscv64.so b/test-data/binaries/lib-riscv64.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-s390x.so b/test-data/binaries/lib-s390x.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-sparc.so b/test-data/binaries/lib-sparc.so +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-win32.dll b/test-data/binaries/lib-win32.dll +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-win64.dll b/test-data/binaries/lib-win64.dll +old mode 100755 +new mode 100644 +diff --git a/test-data/binaries/lib-x86_64.so b/test-data/binaries/lib-x86_64.so +old mode 100755 +new mode 100644 +diff --git a/test-data/phony-guests/make-archlinux-img.sh b/test-data/phony-guests/make-archlinux-img.sh +index 066df09d..e0e3d3de 100755 +--- a/test-data/phony-guests/make-archlinux-img.sh ++++ b/test-data/phony-guests/make-archlinux-img.sh +@@ -50,6 +50,7 @@ write /etc/hostname "archlinux.test" + upload $SRCDIR/archlinux-package /var/lib/pacman/local/test-package-1:0.1-1/desc + + upload $SRCDIR/../binaries/bin-x86_64-dynamic /bin/ls ++chmod 0755 /bin/ls + + mkdir /boot/grub + touch /boot/grub/grub.conf +diff --git a/test-data/phony-guests/make-debian-img.sh b/test-data/phony-guests/make-debian-img.sh +index 637bd4bc..27c68e6e 100755 +--- a/test-data/phony-guests/make-debian-img.sh ++++ b/test-data/phony-guests/make-debian-img.sh +@@ -85,6 +85,7 @@ write /etc/hostname "debian.invalid" + upload $SRCDIR/debian-packages /var/lib/dpkg/status + + upload $SRCDIR/../binaries/bin-x86_64-dynamic /bin/ls ++chmod 0755 /bin/ls + + upload $SRCDIR/debian-syslog /var/log/syslog + +diff --git a/test-data/phony-guests/make-fedora-img.pl b/test-data/phony-guests/make-fedora-img.pl +index 6362e225..b7dc902e 100755 +--- a/test-data/phony-guests/make-fedora-img.pl ++++ b/test-data/phony-guests/make-fedora-img.pl +@@ -331,6 +331,7 @@ $g->write ('/usr/lib/rpm/macros', <upload ($ENV{SRCDIR}.'/../binaries/bin-x86_64-dynamic', '/bin/ls'); ++$g->chmod (0755, '/bin/ls'); + + $g->tar_in ($ENV{SRCDIR}.'/fedora-journal.tar.xz', '/var/log/journal', compress => "xz"); + +diff --git a/test-data/phony-guests/make-ubuntu-img.sh b/test-data/phony-guests/make-ubuntu-img.sh +index a3aa6105..5e7a3a96 100755 +--- a/test-data/phony-guests/make-ubuntu-img.sh ++++ b/test-data/phony-guests/make-ubuntu-img.sh +@@ -76,6 +76,7 @@ write /etc/hostname "ubuntu.invalid" + upload $SRCDIR/debian-packages /var/lib/dpkg/status + + upload $SRCDIR/../binaries/bin-x86_64-dynamic /bin/ls ++chmod 0755 /bin/ls + + mkdir /boot/grub + touch /boot/grub/grub.conf diff --git a/0047-gobject-tests-Don-t-erase-error-messages.patch b/0047-gobject-tests-Don-t-erase-error-messages.patch new file mode 100644 index 0000000..e6e3a13 --- /dev/null +++ b/0047-gobject-tests-Don-t-erase-error-messages.patch @@ -0,0 +1,20 @@ +From c1bae8cb76bd14b0bc02983e7e25be09ebc0a19d Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 25 Apr 2024 13:15:08 +0100 +Subject: [PATCH] gobject: tests: Don't erase error messages + +(cherry picked from commit e0ffe31e96d23b4ffce27fa6c3b1590e3641a910) +--- + gobject/run-tests-retvalues | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gobject/run-tests-retvalues b/gobject/run-tests-retvalues +index 272b92e4..d594b464 100755 +--- a/gobject/run-tests-retvalues ++++ b/gobject/run-tests-retvalues +@@ -22,4 +22,4 @@ $TEST_FUNCTIONS + skip_if_skipped + skip_unless_environment_variable_set GJS + +-$GJS $srcdir/bindtests-retvalues.js 2>/dev/null ++$GJS $srcdir/bindtests-retvalues.js diff --git a/0048-daemon-parted-Assume-sfdisk-part-type-exists.patch b/0048-daemon-parted-Assume-sfdisk-part-type-exists.patch new file mode 100644 index 0000000..8646aea --- /dev/null +++ b/0048-daemon-parted-Assume-sfdisk-part-type-exists.patch @@ -0,0 +1,125 @@ +From 27645254de11a50778161e1d864998323e28bb9e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 10 May 2024 13:45:59 +0100 +Subject: [PATCH] daemon/parted: Assume sfdisk --part-type exists + +This "new" parameter was added in 2014: + + commit 8eab3194ce1737a167812d5e84d83b0dfc253fac + Author: Karel Zak + Date: Mon Sep 15 12:37:52 2014 +0200 + + sfdisk: add --parttype + + The patch also makes --{id,change-id,print-id} deprecated in favour + of --parttype. The original --id is too generic option name and the + --print-id and --change-id are unnecessary and inconsistent with + another sfdisk options (e.g. we don't have --change-bootable) + +Also remove an extraneous / incorrect comment about parted. As +history has played out, sfdisk proves to be the better tool and parted +is a PITA. + +(cherry picked from commit 857615d6d258d5bb3badf4caebd4bc8e69f1a33a) +--- + daemon/parted.c | 32 +++----------------------------- + daemon/parted.ml | 22 +--------------------- + 2 files changed, 4 insertions(+), 50 deletions(-) + +diff --git a/daemon/parted.c b/daemon/parted.c +index 6d33e5a6..d0f2ce03 100644 +--- a/daemon/parted.c ++++ b/daemon/parted.c +@@ -424,30 +424,6 @@ do_part_get_bootable (const char *device, int partnum) + return strstr (boot, "boot") != NULL; + } + +-/* Test if sfdisk is recent enough to have --part-type, to be used instead +- * of --print-id and --change-id. +- */ +-static int +-test_sfdisk_has_part_type (void) +-{ +- static int tested = -1; +- +- if (tested != -1) +- return tested; +- +- int r; +- CLEANUP_FREE char *out = NULL, *err = NULL; +- +- r = command (&out, &err, "sfdisk", "--help", NULL); +- if (r == -1) { +- reply_with_error ("%s: %s", "sfdisk --help", err); +- return -1; +- } +- +- tested = strstr (out, "--part-type") != NULL; +- return tested; +-} +- + int + do_part_set_mbr_id (const char *device, int partnum, int idbyte) + { +@@ -456,8 +432,6 @@ do_part_set_mbr_id (const char *device, int partnum, int idbyte) + return -1; + } + +- const char *param = test_sfdisk_has_part_type () ? "--part-type" : "--change-id"; +- + char partnum_str[16]; + snprintf (partnum_str, sizeof partnum_str, "%d", partnum); + +@@ -470,10 +444,10 @@ do_part_set_mbr_id (const char *device, int partnum, int idbyte) + + udev_settle (); + +- r = command (NULL, &err, "sfdisk", +- param, device, partnum_str, idbyte_str, NULL); ++ r = command (NULL, &err, "sfdisk", "--part-type", ++ device, partnum_str, idbyte_str, NULL); + if (r == -1) { +- reply_with_error ("sfdisk %s: %s", param, err); ++ reply_with_error ("sfdisk --part-type: %s", err); + return -1; + } + +diff --git a/daemon/parted.ml b/daemon/parted.ml +index e0ca7a60..c9e55890 100644 +--- a/daemon/parted.ml ++++ b/daemon/parted.ml +@@ -25,33 +25,13 @@ open Utils + + include Structs + +-(* Test if [sfdisk] is recent enough to have [--part-type], to be used +- * instead of [--print-id] and [--change-id]. +- *) +-let test_sfdisk_has_part_type = lazy ( +- let out = command "sfdisk" ["--help"] in +- String.find out "--part-type" >= 0 +-) +- +-(* Currently we use sfdisk for getting and setting the ID byte. In +- * future, extend parted to provide this functionality. As a result +- * of using sfdisk, this won't work for non-MBR-style partitions, but +- * that limitation is noted in the documentation and we can extend it +- * later without breaking the ABI. +- *) + let part_get_mbr_id device partnum = + if partnum <= 0 then + failwith "partition number must be >= 1"; + +- let param = +- if Lazy.force test_sfdisk_has_part_type then +- "--part-type" +- else +- "--print-id" in +- + udev_settle (); + let out = +- command "sfdisk" [param; device; string_of_int partnum] in ++ command "sfdisk" ["--part-type"; device; string_of_int partnum] in + udev_settle (); + + (* It's printed in hex, possibly with a leading space. *) diff --git a/0049-generator-daemon-Don-t-truncate-64-bit-results-from-.patch b/0049-generator-daemon-Don-t-truncate-64-bit-results-from-.patch new file mode 100644 index 0000000..cecd14b --- /dev/null +++ b/0049-generator-daemon-Don-t-truncate-64-bit-results-from-.patch @@ -0,0 +1,31 @@ +From 7a6d56d653e7bd41e2e0f6b7ab56a0a2b874572e Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 28 Jun 2024 09:39:59 +0100 +Subject: [PATCH] generator/daemon: Don't truncate 64 bit results from OCaml + functions + +Commit d5b6f1df5f ("daemon: Allow parts of the daemon and APIs to be +written in OCaml.", 2017) contained a bug where in any OCaml function +that returns int64_t, the result was truncated to an int. This +particularly affected part_get_gpt_attributes as that returns large 64 +bit numbers, but probably affects other functions too, undetected. + +Fixes: commit d5b6f1df5ff2d387a5dfc89b8316c0dff67ce2c9 +(cherry picked from commit 882ef4d93a2f8b150a66fa89f87ef1c4dd42de2f) +--- + generator/daemon.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/generator/daemon.ml b/generator/daemon.ml +index a2c06f14..5dba2eee 100644 +--- a/generator/daemon.ml ++++ b/generator/daemon.ml +@@ -835,7 +835,7 @@ let generate_daemon_caml_stubs () = + | RInt _ -> + pr " CAMLreturnT (int, Int_val (retv));\n" + | RInt64 _ -> +- pr " CAMLreturnT (int, Int64_val (retv));\n" ++ pr " CAMLreturnT (int64_t, Int64_val (retv));\n" + | RBool _ -> + pr " CAMLreturnT (int, Bool_val (retv));\n" + | RConstString _ -> assert false diff --git a/libguestfs.spec b/libguestfs.spec index 5ddffa7..6e89ac4 100644 --- a/libguestfs.spec +++ b/libguestfs.spec @@ -45,7 +45,7 @@ Summary: Access and modify virtual machine disk images Name: libguestfs Epoch: 1 Version: 1.50.1 -Release: 10%{?dist} +Release: 11%{?dist} License: LGPLv2+ # Build only for architectures that have a kernel @@ -136,6 +136,10 @@ Patch0042: 0042-po-docs-Rename-guestfs-release-notes-historical-to-g.patch Patch0043: 0043-po-docs-Run-po4a-translate-and-sed-commands-separate.patch Patch0044: 0044-Update-common-submodule.patch Patch0045: 0045-po-docs-Make-sure-guestmount.1-depends-on-includes.patch +Patch0046: 0046-test-data-binaries-Remove-x-attribute.patch +Patch0047: 0047-gobject-tests-Don-t-erase-error-messages.patch +Patch0048: 0048-daemon-parted-Assume-sfdisk-part-type-exists.patch +Patch0049: 0049-generator-daemon-Don-t-truncate-64-bit-results-from-.patch %if 0%{patches_touch_autotools} BuildRequires: autoconf, automake, libtool, gettext-devel @@ -1148,6 +1152,10 @@ rm ocaml/html/.gitignore %changelog +* Fri Jun 28 2024 Richard W.M. Jones - 1:1.50.1-11 +- Fix (rare) undetected truncation of 64 bit int results to 32 bits + resolves: RHEL-45466 + * Thu Jun 20 2024 Richard W.M. Jones - 1:1.50.1-10 - Remove bundled ocaml-augeas resolves: RHEL-32142