Rebase to guestfs-tools 1.51.6

Implement --key all:...
  resolves: RHEL-19030
Fix crash because of off-by-one error
  resolves: RHEL-19062
This commit is contained in:
Richard W.M. Jones 2023-12-11 16:47:18 +00:00
parent dbcc9103ca
commit 2bd1392fb7
11 changed files with 47 additions and 4464 deletions

View File

@ -0,0 +1,26 @@
From 28ecb8693bbded3e1c70c1baa57f3498a6b8127e Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 9 Dec 2023 12:59:13 +0000
Subject: [PATCH] Update common submodule
Pick up this bug fix:
mltools/libosinfo-c.c: Fix off-by-one error
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common cd29aee91..0dba002c2:
diff --git a/common/mltools/libosinfo-c.c b/common/mltools/libosinfo-c.c
index 93357fd91..a48c8989f 100644
--- a/common/mltools/libosinfo-c.c
+++ b/common/mltools/libosinfo-c.c
@@ -296,7 +296,7 @@ v2v_osinfo_os_get_device_drivers (value osv)
driver = OSINFO_DEVICE_DRIVER(osinfo_list_get_nth (OSINFO_LIST(list), i));
- vi = caml_alloc (6, 0);
+ vi = caml_alloc (7, 0);
str = osinfo_device_driver_get_architecture (driver);
copyv = caml_copy_string (str);
Store_field (vi, 0, copyv);

View File

@ -1,4 +1,4 @@
From b4f4e1906b8de6286889690047e35969d2dfaa91 Mon Sep 17 00:00:00 2001
From 1ea6c78c7fc6a3ebbe818409ba41be6d1f178381 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 7 Jul 2015 09:28:03 -0400
Subject: [PATCH] RHEL: Reject use of libguestfs-winsupport features except for

View File

@ -1,4 +1,4 @@
From 01ebf5d7d5656b45168de9081906522a32008080 Mon Sep 17 00:00:00 2001
From 3ad2b829e42b535a7a6f01dda06cc9c9d4f09664 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 21 Nov 2022 13:03:22 +0000
Subject: [PATCH] RHEL: builder: Disable opensuse repository

File diff suppressed because it is too large Load Diff

View File

@ -1,480 +0,0 @@
From ec06f62df5340cd0a9466a532aa9806fb0e2e560 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 18 Feb 2023 12:04:04 +0000
Subject: [PATCH] drivers: Look up vendor and device names in PCI and USB IDs
database
(cherry picked from commit ca21ee4918cd7d4472bd875a495752a03a03fa87)
---
.gitignore | 1 +
configure.ac | 1 +
drivers/Makefile.am | 6 +-
drivers/drivers.ml | 31 +++++
drivers/hwdata.ml | 187 +++++++++++++++++++++++++++
drivers/hwdata.mli | 31 +++++
drivers/hwdata_config.ml.in | 26 ++++
drivers/hwdata_config.mli | 35 +++++
drivers/test-virt-drivers-windows.sh | 13 +-
m4/guestfs-libraries.m4 | 3 +
po/POTFILES-ml | 2 +
11 files changed, 333 insertions(+), 3 deletions(-)
create mode 100644 drivers/hwdata.ml
create mode 100644 drivers/hwdata.mli
create mode 100644 drivers/hwdata_config.ml.in
create mode 100644 drivers/hwdata_config.mli
diff --git a/.gitignore b/.gitignore
index b0ada2e3c..c0ca330a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -95,6 +95,7 @@ Makefile.in
/customize/virt-customize
/df/virt-df
/drivers/.depend
+/drivers/hwdata_config.ml
/drivers/virt-drivers
/diff/virt-diff
/edit/virt-edit
diff --git a/configure.ac b/configure.ac
index 34c66b80e..e9fadcc9b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -138,6 +138,7 @@ AC_CONFIG_FILES([Makefile
df/Makefile
diff/Makefile
drivers/Makefile
+ drivers/hwdata_config.ml
edit/Makefile
format/Makefile
get-kernel/Makefile
diff --git a/drivers/Makefile.am b/drivers/Makefile.am
index d27fc2e27..7e0ef659c 100644
--- a/drivers/Makefile.am
+++ b/drivers/Makefile.am
@@ -27,9 +27,13 @@ EXTRA_DIST = \
virt-drivers.pod
SOURCES_MLI = \
- drivers.mli
+ drivers.mli \
+ hwdata_config.mli \
+ hwdata.mli
SOURCES_ML = \
+ hwdata_config.ml \
+ hwdata.ml \
drivers.ml
SOURCES_C = \
diff --git a/drivers/drivers.ml b/drivers/drivers.ml
index 57cfb557c..f02165fa4 100644
--- a/drivers/drivers.ml
+++ b/drivers/drivers.ml
@@ -235,8 +235,14 @@ and windows_hardware_to_xml = function
(Option.map (fun v -> ("class", sprintf "%06LX" v)) pci_class);
List.may_push_back attrs
(Option.map (fun v -> ("vendor", sprintf "%04LX" v)) pci_vendor);
+ let vendorname = get_pci_vendor pci_vendor in
+ List.may_push_back attrs
+ (Option.map (fun v -> "vendorname", v) vendorname);
List.may_push_back attrs
(Option.map (fun v -> ("device", sprintf "%04LX" v)) pci_device);
+ let devicename = get_pci_device pci_vendor pci_device in
+ List.may_push_back attrs
+ (Option.map (fun v -> "devicename", v) devicename);
List.may_push_back attrs
(Option.map (fun v -> ("subsystem", sprintf "%08LX" v)) pci_subsys);
List.may_push_back attrs
@@ -261,8 +267,14 @@ and windows_hardware_to_xml = function
let attrs = ref [] in
List.may_push_back attrs
(Option.map (fun v -> ("vendor", sprintf "%04LX" v)) usb_vendor);
+ let vendorname = get_usb_vendor usb_vendor in
+ List.may_push_back attrs
+ (Option.map (fun v -> "vendorname", v) vendorname);
List.may_push_back attrs
(Option.map (fun v -> ("product", sprintf "%04LX" v)) usb_product);
+ let productname = get_usb_device usb_vendor usb_product in
+ List.may_push_back attrs
+ (Option.map (fun v -> "productname", v) productname);
List.may_push_back attrs
(Option.map (fun v -> ("revision", sprintf "%02LX" v)) usb_rev);
List.may_push_back attrs
@@ -272,6 +284,25 @@ and windows_hardware_to_xml = function
| Other path ->
Comment (sprintf "unknown DeviceId: %s" (String.concat "\\" path))
+and get_pci_vendor v = get_hwdata'1 Hwdata.pci_vendor v
+and get_pci_device v d = get_hwdata'2 Hwdata.pci_device v d
+and get_usb_vendor v = get_hwdata'1 Hwdata.usb_vendor v
+and get_usb_device v d = get_hwdata'2 Hwdata.usb_device v d
+
+and get_hwdata'1 f = function
+ | Some i64 when i64 >= 0_L && i64 <= 0xffff_L ->
+ let i32 = Int64.to_int32 i64 in
+ f i32
+ | _ -> None
+
+and get_hwdata'2 f v d =
+ match v, d with
+ | Some v64, Some d64 when v64 >= 0_L && v64 <= 0xffff_L &&
+ d64 >= 0_L && d64 <= 0xffff_L ->
+ let v32 = Int64.to_int32 v64 and d32 = Int64.to_int32 d64 in
+ f v32 d32
+ | _ -> None
+
(* Main program. *)
let main () =
let add, ks = parse_cmdline () in
diff --git a/drivers/hwdata.ml b/drivers/hwdata.ml
new file mode 100644
index 000000000..4b46eff68
--- /dev/null
+++ b/drivers/hwdata.ml
@@ -0,0 +1,187 @@
+(* virt-drivers
+ * Copyright (C) 2009-2023 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+open Std_utils
+open Tools_utils
+open Common_gettext.Gettext
+
+open Printf
+open Scanf
+
+module DBKey = struct
+ type t =
+ | Vendor of int32
+ | Device of int32 * int32
+ let compare = compare
+end
+module DB = Map.Make (DBKey)
+
+let is_4_digit_hex id =
+ String.length id = 4 &&
+ Char.isxdigit id.[0] &&
+ Char.isxdigit id.[1] &&
+ Char.isxdigit id.[2] &&
+ Char.isxdigit id.[3]
+let hex_to_int32 id = sscanf id "%lx" identity
+
+(* Loads one of the [*.ids] files, returning the entries as a
+ * 3 level map. Returns [None] if the file could not be opened
+ * or parsed.
+ *)
+let load filename =
+ try
+ let lines = read_whole_file filename in
+ let lines = String.lines_split lines in
+
+ (* This loop drops blank lines and comments, splits the fields of
+ * the database, and returns [(lineno, indent, key, label) list].
+ *)
+ let rec loop lineno acc = function
+ | [] -> List.rev acc
+ (* Blank lines. *)
+ | "" :: lines ->
+ loop (lineno+1) acc lines
+ (* Note that # only starts a comment at the beginning of the line. *)
+ | comment :: lines when String.is_prefix comment "#" ->
+ loop (lineno+1) acc lines
+ (* Otherwise its some data. *)
+ | line :: lines ->
+ let len = String.length line in
+ let indent =
+ let rec counttabs i =
+ if i < len && line.[i] = '\t' then 1 + counttabs (i+1) else 0
+ in
+ counttabs 0 in
+ let line = String.sub line indent (len - indent) in
+
+ let n = String.cspan line " \t" in
+ let key, label = String.break n line in
+ let n = String.span label " \t" in
+ let _, label = String.break n label in
+
+ let acc =
+ if key = "" && label = "" then acc
+ else (lineno, indent, key, label) :: acc in
+
+ loop (lineno+1) acc lines
+ in
+ let lines = loop 1 [] lines in
+
+ (* Since the format is essentially a space-saving one where
+ * vendor name
+ * \t device name
+ * is short for:
+ * vendor name
+ * vendor device name
+ * pull the fields from previous lines down, resulting in
+ * a flat list.
+ *)
+ let rec loop keys acc = function
+ | [] -> List.rev acc
+ | (lineno, indent, key, label) :: lines ->
+ let prefix = List.take indent keys in
+ let keys = prefix @ [ key ] in
+ let acc = (lineno, keys, label) :: acc in
+ loop keys acc lines
+ in
+ let lines = loop [] [] lines in
+
+ (*
+ List.iter (
+ fun (lineno, keys, label) ->
+ eprintf "[%s] -> %s # line %d\n"
+ (String.concat ";" keys) label lineno
+ ) lines;
+ *)
+
+ (* Now we can finally process the database.
+ *
+ * We currently ignore the [C] (class) and other records
+ * that appear at the end of the file. We might want to
+ * try parsing these in future. It will require changes to
+ * the code above because the label isn't parsed right.
+ *)
+ let db =
+ List.fold_left (
+ fun db (lineno, keys, label) ->
+ let loc = filename, lineno in
+ match keys with
+ | [vendor] when is_4_digit_hex vendor ->
+ let vendor = hex_to_int32 vendor in
+ DB.add (Vendor vendor) (label, loc) db
+ | [vendor; device] when is_4_digit_hex vendor &&
+ is_4_digit_hex device ->
+ let vendor = hex_to_int32 vendor in
+ let device = hex_to_int32 device in
+ DB.add (Device (vendor, device)) (label, loc) db
+ | _ ->
+ db
+ ) DB.empty lines in
+
+ Some db
+ with exn ->
+ warning (f_"hwdata: %s: %s") filename (Printexc.to_string exn);
+ None
+
+(* Lazily load the PCI database, if present. *)
+let pci_db =
+ let filename = Hwdata_config.pci_ids in
+ lazy (match filename with None -> None | Some filename -> load filename)
+
+(* Look up PCI vendor and device ID. *)
+let pci_vendor vendor =
+ let db = Lazy.force pci_db in
+ match db with
+ | None -> None
+ | Some db ->
+ match DB.find_opt (Vendor vendor) db with
+ | None -> None
+ | Some (label, _) -> Some label
+
+let pci_device vendor device =
+ let db = Lazy.force pci_db in
+ match db with
+ | None -> None
+ | Some db ->
+ match DB.find_opt (Device (vendor, device)) db with
+ | None -> None
+ | Some (label, _) -> Some label
+
+(* Lazily load the USB database, if present. *)
+let usb_db =
+ let filename = Hwdata_config.usb_ids in
+ lazy (match filename with None -> None | Some filename -> load filename)
+
+(* Look up USB vendor and device ID. *)
+let usb_vendor vendor =
+ let db = Lazy.force usb_db in
+ match db with
+ | None -> None
+ | Some db ->
+ match DB.find_opt (Vendor vendor) db with
+ | None -> None
+ | Some (label, _) -> Some label
+
+let usb_device vendor device =
+ let db = Lazy.force usb_db in
+ match db with
+ | None -> None
+ | Some db ->
+ match DB.find_opt (Device (vendor, device)) db with
+ | None -> None
+ | Some (label, _) -> Some label
diff --git a/drivers/hwdata.mli b/drivers/hwdata.mli
new file mode 100644
index 000000000..972dfe1f6
--- /dev/null
+++ b/drivers/hwdata.mli
@@ -0,0 +1,31 @@
+(* virt-drivers
+ * Copyright (C) 2013-2023 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+(** Look up PCI and USB vendor and device IDs. *)
+
+val pci_vendor : int32 -> string option
+(** Look up the PCI vendor ID. If found, return the name. *)
+
+val pci_device : int32 -> int32 -> string option
+(** Look up the PCI vendor & device ID. If found, return the name. *)
+
+val usb_vendor : int32 -> string option
+(** Look up the USB vendor ID. If found, return the name. *)
+
+val usb_device : int32 -> int32 -> string option
+(** Look up the USB vendor & device ID. If found, return the name. *)
diff --git a/drivers/hwdata_config.ml.in b/drivers/hwdata_config.ml.in
new file mode 100644
index 000000000..fa792c086
--- /dev/null
+++ b/drivers/hwdata_config.ml.in
@@ -0,0 +1,26 @@
+(* virt-drivers
+ * @configure_input@
+ * Copyright (C) 2009-2023 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+open Std_utils
+
+let dir = "@HWDATA_PKGDATADIR@"
+let dir = if dir = "" then None else Some dir
+
+let pci_ids = Option.map (fun d -> d // "pci.ids") dir
+let usb_ids = Option.map (fun d -> d // "usb.ids") dir
diff --git a/drivers/hwdata_config.mli b/drivers/hwdata_config.mli
new file mode 100644
index 000000000..877e9e28a
--- /dev/null
+++ b/drivers/hwdata_config.mli
@@ -0,0 +1,35 @@
+(* virt-drivers
+ * Copyright (C) 2013-2023 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+val dir : string option
+(** [pkgdatadir] variable defined by hwdata.pc
+
+ This is the name of the directory containing [pci.ids] and
+ related files which contain the PCI IDs. *)
+
+val pci_ids : string option
+(** Path to the [pci.ids] file.
+
+ Note at runtime this is an optional dependency, so it may
+ not at exist even if not [None]. *)
+
+val usb_ids : string option
+(** Path to the [usb.ids] file.
+
+ Note at runtime this is an optional dependency, so it may
+ not at exist even if not [None]. *)
diff --git a/drivers/test-virt-drivers-windows.sh b/drivers/test-virt-drivers-windows.sh
index df3f36c64..4131f6e5e 100755
--- a/drivers/test-virt-drivers-windows.sh
+++ b/drivers/test-virt-drivers-windows.sh
@@ -22,9 +22,18 @@ $TEST_FUNCTIONS
skip_if_skipped
skip_unless_phony_guest windows.img
-rm -f actual-windows.xml
+rm -f actual-windows.xml actual-windows.xml.bak
$VG virt-drivers --format=raw -a ../test-data/phony-guests/windows.img > actual-windows.xml
+
+# We can't predict if hwdata is available, so we don't know if
+# vendorname and devicename fields will be present. If present,
+# remove them before comparison.
+mv actual-windows.xml actual-windows.xml.bak
+sed -e "s/ vendorname='\([^']*\)'//g" \
+ -e "s/ devicename='\([^']*\)'//g" \
+ < actual-windows.xml.bak > actual-windows.xml
+
diff -ur -I "generated by" expected-windows.xml actual-windows.xml
-rm actual-windows.xml
+rm actual-windows.xml actual-windows.xml.bak
diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4
index 2d252bf9e..32f93afda 100644
--- a/m4/guestfs-libraries.m4
+++ b/m4/guestfs-libraries.m4
@@ -169,3 +169,6 @@ PKG_CHECK_MODULES([JANSSON], [jansson >= 2.7])
dnl Check for libosinfo (mandatory)
PKG_CHECK_MODULES([LIBOSINFO], [libosinfo-1.0])
+
+dnl Check for hwdata directory (containing pci.ids) (optional, for virt-drivers)
+PKG_CHECK_VAR([HWDATA_PKGDATADIR], [hwdata], [pkgdatadir])
diff --git a/po/POTFILES-ml b/po/POTFILES-ml
index 73984796f..7632f374d 100644
--- a/po/POTFILES-ml
+++ b/po/POTFILES-ml
@@ -79,6 +79,8 @@ dib/output_format_tgz.ml
dib/output_format_vhd.ml
dib/utils.ml
drivers/drivers.ml
+drivers/hwdata.ml
+drivers/hwdata_config.ml
get-kernel/get_kernel.ml
resize/resize.ml
sparsify/cmdline.ml

View File

@ -1,203 +0,0 @@
From a55dcd5162e51a952ee6c23c4a89c1b098f304f4 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 19 May 2023 17:55:05 +0200
Subject: [PATCH] update common submodule
Laszlo Ersek (2):
options/keys: key_store_import_key(): un-constify "key" parameter
options/keys: introduce unescape_device_mapper_lvm()
Richard W.M. Jones (1):
mlcustomize/SELinux_relabel.ml: Use Array.mem
Roman Kagan (1):
mlcustomize: skip SELinux relabeling if it's disabled
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2168506
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20230519155507.369494-2-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 4ddcae7e8543d2a63d907729d5b0d22f659d071f)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 70c10a079..b636c3f20:
diff --git a/common/options/options.h b/common/options/options.h
index 94573ee06..94e8b9eef 100644
--- a/common/options/options.h
+++ b/common/options/options.h
@@ -169,7 +169,8 @@ extern struct matching_key *get_keys (struct key_store *ks, const char *device,
const char *uuid, size_t *nr_matches);
extern void free_keys (struct matching_key *keys, size_t nr_matches);
extern struct key_store *key_store_add_from_selector (struct key_store *ks, const char *selector);
-extern struct key_store *key_store_import_key (struct key_store *ks, const struct key_store_key *key);
+extern struct key_store *key_store_import_key (struct key_store *ks,
+ struct key_store_key *key);
extern bool key_store_requires_network (const struct key_store *ks);
extern void free_key_store (struct key_store *ks);
diff --git a/common/mlcustomize/SELinux_relabel.ml b/common/mlcustomize/SELinux_relabel.ml
index 5ecf7bd7e..2f3a09bf7 100644
--- a/common/mlcustomize/SELinux_relabel.ml
+++ b/common/mlcustomize/SELinux_relabel.ml
@@ -24,10 +24,6 @@ open Printf
module G = Guestfs
-(* Simple reimplementation of Array.mem, available only with OCaml >= 4.03. *)
-let array_find a l =
- List.mem a (Array.to_list l)
-
let rec relabel (g : G.guestfs) =
(* Is the guest using SELinux? (Otherwise this is a no-op). *)
if is_selinux_guest g then (
@@ -59,14 +55,24 @@ and use_setfiles g =
g#aug_load ();
debug_augeas_errors g;
+ let config_path = "/files/etc/selinux/config" in
+ let config_keys = g#aug_ls config_path in
+ (* SELinux may be disabled via a setting in config file *)
+ let selinux_disabled =
+ let selinuxmode_path = config_path ^ "/SELINUX" in
+ if Array.mem selinuxmode_path config_keys then
+ g#aug_get selinuxmode_path = "disabled"
+ else
+ false in
+ if selinux_disabled then
+ failwith "selinux disabled";
+
(* Get the SELinux policy name, eg. "targeted", "minimum".
* Use "targeted" if not specified, just like libselinux does.
*)
let policy =
- let config_path = "/files/etc/selinux/config" in
let selinuxtype_path = config_path ^ "/SELINUXTYPE" in
- let keys = g#aug_ls config_path in
- if array_find selinuxtype_path keys then
+ if Array.mem selinuxtype_path config_keys then
g#aug_get selinuxtype_path
else
"targeted" in
diff --git a/common/options/keys.c b/common/options/keys.c
index 48f1bc7c7..52b273690 100644
--- a/common/options/keys.c
+++ b/common/options/keys.c
@@ -260,8 +260,107 @@ key_store_add_from_selector (struct key_store *ks, const char *selector)
return key_store_import_key (ks, &key);
}
+/* Turn /dev/mapper/VG-LV into /dev/VG/LV, in-place. */
+static void
+unescape_device_mapper_lvm (char *id)
+{
+ static const char dev[] = "/dev/", dev_mapper[] = "/dev/mapper/";
+ const char *input_start;
+ char *output;
+ enum { M_SCAN, M_FILL, M_DONE } mode;
+
+ if (!STRPREFIX (id, dev_mapper))
+ return;
+
+ /* Start parsing "VG-LV" from "id" after "/dev/mapper/". */
+ input_start = id + (sizeof dev_mapper - 1);
+
+ /* Start writing the unescaped "VG/LV" output after "/dev/". */
+ output = id + (sizeof dev - 1);
+
+ for (mode = M_SCAN; mode < M_DONE; ++mode) {
+ char c;
+ const char *input = input_start;
+ const char *hyphen_buffered = NULL;
+ bool single_hyphen_seen = false;
+
+ do {
+ c = *input;
+
+ switch (c) {
+ case '-':
+ if (hyphen_buffered == NULL)
+ /* This hyphen may start an escaped hyphen, or it could be the
+ * separator in VG-LV.
+ */
+ hyphen_buffered = input;
+ else {
+ /* This hyphen completes an escaped hyphen; unescape it. */
+ if (mode == M_FILL)
+ *output++ = '-';
+ hyphen_buffered = NULL;
+ }
+ break;
+
+ case '/':
+ /* Slash characters are forbidden in VG-LV anywhere. If there's any,
+ * we'll find it in the first (i.e., scanning) phase, before we output
+ * anything back to "id".
+ */
+ assert (mode == M_SCAN);
+ return;
+
+ default:
+ /* Encountered a non-slash, non-hyphen character -- which also may be
+ * the terminating NUL.
+ */
+ if (hyphen_buffered != NULL) {
+ /* The non-hyphen character comes after a buffered hyphen, so the
+ * buffered hyphen is supposed to be the single hyphen that separates
+ * VG from LV in VG-LV. There are three requirements for this
+ * separator: (a) it must be unique (we must not have seen another
+ * such separator earlier), (b) it must not be at the start of VG-LV
+ * (because VG would be empty that way), (c) it must not be at the end
+ * of VG-LV (because LV would be empty that way). Should any of these
+ * be violated, we'll catch that during the first (i.e., scanning)
+ * phase, before modifying "id".
+ */
+ if (single_hyphen_seen || hyphen_buffered == input_start ||
+ c == '\0') {
+ assert (mode == M_SCAN);
+ return;
+ }
+
+ /* Translate the separator hyphen to a slash character. */
+ if (mode == M_FILL)
+ *output++ = '/';
+ hyphen_buffered = NULL;
+ single_hyphen_seen = true;
+ }
+
+ /* Output the non-hyphen character (including the terminating NUL)
+ * regardless of whether there was a buffered hyphen separator (which,
+ * by now, we'll have attempted to translate and flush).
+ */
+ if (mode == M_FILL)
+ *output++ = c;
+ }
+
+ ++input;
+ } while (c != '\0');
+
+ /* We must have seen the VG-LV separator. If that's not the case, we'll
+ * catch it before modifying "id".
+ */
+ if (!single_hyphen_seen) {
+ assert (mode == M_SCAN);
+ return;
+ }
+ }
+}
+
struct key_store *
-key_store_import_key (struct key_store *ks, const struct key_store_key *key)
+key_store_import_key (struct key_store *ks, struct key_store_key *key)
{
struct key_store_key *new_keys;
@@ -278,6 +377,7 @@ key_store_import_key (struct key_store *ks, const struct key_store_key *key)
error (EXIT_FAILURE, errno, "realloc");
ks->keys = new_keys;
+ unescape_device_mapper_lvm (key->id);
ks->keys[ks->nr_keys] = *key;
++ks->nr_keys;

View File

@ -1,88 +0,0 @@
From 9ac1ea9d5269c72874ea662cd70803b3781d0876 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 19 May 2023 17:55:06 +0200
Subject: [PATCH] inspector: rename VGs and LVs in LUKS-on-LVM test
In preparation for a subsequent patch, rename "VG" to "Volume-Group", and
"LV<n>" to "Logical-Volume-<n>", in the LUKS-on-LVM virt-inspector test.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2168506
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20230519155507.369494-3-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 46a381efcf2bf74f1534ecb198f9570ee5baaccd)
---
inspector/test-virt-inspector-luks-on-lvm.sh | 11 +++----
test-data/phony-guests/make-fedora-img.pl | 30 +++++++++++---------
2 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/inspector/test-virt-inspector-luks-on-lvm.sh b/inspector/test-virt-inspector-luks-on-lvm.sh
index b9989433d..35454e630 100755
--- a/inspector/test-virt-inspector-luks-on-lvm.sh
+++ b/inspector/test-virt-inspector-luks-on-lvm.sh
@@ -36,14 +36,15 @@ if [ "$(guestfish version | grep minor | awk '{print $2}')" -lt 47 ]; then
fi
f=../test-data/phony-guests/fedora-luks-on-lvm.img
-keys=(--key /dev/VG/Root:key:FEDORA-Root
- --key /dev/VG/LV1:key:FEDORA-LV1
- --key /dev/VG/LV2:key:FEDORA-LV2
- --key /dev/VG/LV3:key:FEDORA-LV3)
+keys=(--key /dev/Volume-Group/Root:key:FEDORA-Root
+ --key /dev/Volume-Group/Logical-Volume-1:key:FEDORA-LV1
+ --key /dev/Volume-Group/Logical-Volume-2:key:FEDORA-LV2
+ --key /dev/Volume-Group/Logical-Volume-3:key:FEDORA-LV3)
# Ignore zero-sized file.
if [ -s "$f" ]; then
- uuid_root=$(guestfish --ro -i -a "$f" "${keys[@]}" luks-uuid /dev/VG/Root)
+ uuid_root=$(guestfish --ro -i -a "$f" "${keys[@]}" \
+ luks-uuid /dev/Volume-Group/Root)
b=$(basename "$f")
$VG virt-inspector "${keys[@]}" --format=raw -a "$f" > "actual-$b.xml"
# Check the generated output validate the schema.
diff --git a/test-data/phony-guests/make-fedora-img.pl b/test-data/phony-guests/make-fedora-img.pl
index ffa7e0f10..9721ce4a9 100755
--- a/test-data/phony-guests/make-fedora-img.pl
+++ b/test-data/phony-guests/make-fedora-img.pl
@@ -224,23 +224,27 @@ EOF
# Create the Volume Group on /dev/sda2.
$g->pvcreate ('/dev/sda2');
- $g->vgcreate ('VG', ['/dev/sda2']);
- $g->lvcreate ('Root', 'VG', 256);
- $g->lvcreate ('LV1', 'VG', 32);
- $g->lvcreate ('LV2', 'VG', 32);
- $g->lvcreate ('LV3', 'VG', 64);
+ $g->vgcreate ('Volume-Group', ['/dev/sda2']);
+ $g->lvcreate ('Root', 'Volume-Group', 256);
+ $g->lvcreate ('Logical-Volume-1', 'Volume-Group', 32);
+ $g->lvcreate ('Logical-Volume-2', 'Volume-Group', 32);
+ $g->lvcreate ('Logical-Volume-3', 'Volume-Group', 64);
# Format each Logical Group as a LUKS device, with a different password.
- $g->luks_format ('/dev/VG/Root', 'FEDORA-Root', 0);
- $g->luks_format ('/dev/VG/LV1', 'FEDORA-LV1', 0);
- $g->luks_format ('/dev/VG/LV2', 'FEDORA-LV2', 0);
- $g->luks_format ('/dev/VG/LV3', 'FEDORA-LV3', 0);
+ $g->luks_format ('/dev/Volume-Group/Root', 'FEDORA-Root', 0);
+ $g->luks_format ('/dev/Volume-Group/Logical-Volume-1', 'FEDORA-LV1', 0);
+ $g->luks_format ('/dev/Volume-Group/Logical-Volume-2', 'FEDORA-LV2', 0);
+ $g->luks_format ('/dev/Volume-Group/Logical-Volume-3', 'FEDORA-LV3', 0);
# Open the LUKS devices. This creates nodes like /dev/mapper/*-luks.
- $g->cryptsetup_open ('/dev/VG/Root', 'FEDORA-Root', 'Root-luks');
- $g->cryptsetup_open ('/dev/VG/LV1', 'FEDORA-LV1', 'LV1-luks');
- $g->cryptsetup_open ('/dev/VG/LV2', 'FEDORA-LV2', 'LV2-luks');
- $g->cryptsetup_open ('/dev/VG/LV3', 'FEDORA-LV3', 'LV3-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Root',
+ 'FEDORA-Root', 'Root-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Logical-Volume-1',
+ 'FEDORA-LV1', 'LV1-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Logical-Volume-2',
+ 'FEDORA-LV2', 'LV2-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Logical-Volume-3',
+ 'FEDORA-LV3', 'LV3-luks');
# Phony root filesystem.
$g->mkfs ('ext2', '/dev/mapper/Root-luks', blocksize => 4096, label => 'ROOT');

View File

@ -1,48 +0,0 @@
From d8d1e7213716835f263a4f20d9e6cf8719c210c0 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 19 May 2023 17:55:07 +0200
Subject: [PATCH] inspector: test /dev/mapper/VG-LV translation in LUKS-on-LVM
test
In the LUKS-on-LVM virt-inspector test, run virt-inspector one more time,
now with such "--key" options that exercise the recent "/dev/mapper/VG-LV"
-> "/dev/VG/LV" translation (unescaping) from libguestfs-common. Verify
that virt-inspector outputs the same XML as it did when we passed it the
"/dev/VG/LV" format "--key" options.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2168506
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20230519155507.369494-4-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 569bd1dd29da7f3a7b3399ad85340f84d59b3a10)
---
inspector/test-virt-inspector-luks-on-lvm.sh | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/inspector/test-virt-inspector-luks-on-lvm.sh b/inspector/test-virt-inspector-luks-on-lvm.sh
index 35454e630..13b25e338 100755
--- a/inspector/test-virt-inspector-luks-on-lvm.sh
+++ b/inspector/test-virt-inspector-luks-on-lvm.sh
@@ -41,6 +41,11 @@ keys=(--key /dev/Volume-Group/Root:key:FEDORA-Root
--key /dev/Volume-Group/Logical-Volume-2:key:FEDORA-LV2
--key /dev/Volume-Group/Logical-Volume-3:key:FEDORA-LV3)
+keys_mapper=(--key /dev/mapper/Volume--Group-Root:key:FEDORA-Root
+ --key /dev/mapper/Volume--Group-Logical--Volume--1:key:FEDORA-LV1
+ --key /dev/mapper/Volume--Group-Logical--Volume--2:key:FEDORA-LV2
+ --key /dev/mapper/Volume--Group-Logical--Volume--3:key:FEDORA-LV3)
+
# Ignore zero-sized file.
if [ -s "$f" ]; then
uuid_root=$(guestfish --ro -i -a "$f" "${keys[@]}" \
@@ -53,4 +58,10 @@ if [ -s "$f" ]; then
# are any differences.
sed -e "s/ROOTUUID/$uuid_root/" < "$srcdir/expected-$b.xml" \
| diff -u - "actual-$b.xml"
+
+ # Re-run virt-inspector with keys using the /dev/mapper/VG-LV format; verify
+ # only that the XML output matches the output from the previous
+ # virt-inspector invocation (which used the /dev/VG/LV format).
+ $VG virt-inspector "${keys_mapper[@]}" --format=raw -a "$f" \
+ | diff -u "actual-$b.xml" -
fi

View File

@ -7,7 +7,7 @@ set -e
# ./copy-patches.sh
project=guestfs-tools
rhel_version=9.3
rhel_version=9.4
# Check we're in the right directory.
if [ ! -f $project.spec ]; then

View File

@ -11,16 +11,16 @@
%global patches_touch_autotools 1
# The source directory.
%global source_directory 1.50-stable
%global source_directory 1.51-development
# Filter perl provides.
%{?perl_default_filter}
Summary: Tools to access and modify virtual machine disk images
Name: guestfs-tools
Version: 1.50.1
Release: 3%{?dist}
License: GPLv2+
Version: 1.51.6
Release: 1%{?dist}
License: GPL-2.0-or-later AND LGPL-2.0-or-later
# Build only for architectures that have a kernel
ExclusiveArch: %{kernel_arches}
@ -45,16 +45,12 @@ Source2: libguestfs.keyring
Source3: copy-patches.sh
# Patches are maintained in the following repository:
# https://github.com/rwmjones/guestfs-tools/commits/rhel-9.3
# https://github.com/rwmjones/guestfs-tools/commits/rhel-9.4
# Patches.
Patch0001: 0001-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch
Patch0002: 0002-RHEL-builder-Disable-opensuse-repository.patch
Patch0003: 0003-Remove-virt-dib.patch
Patch0004: 0004-drivers-Look-up-vendor-and-device-names-in-PCI-and-U.patch
Patch0005: 0005-update-common-submodule.patch
Patch0006: 0006-inspector-rename-VGs-and-LVs-in-LUKS-on-LVM-test.patch
Patch0007: 0007-inspector-test-dev-mapper-VG-LV-translation-in-LUKS-.patch
Patch0001: 0001-Update-common-submodule.patch
Patch0002: 0002-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch
Patch0003: 0003-RHEL-builder-Disable-opensuse-repository.patch
%if 0%{patches_touch_autotools}
BuildRequires: autoconf, automake, libtool, gettext-devel
@ -207,7 +203,7 @@ Virt-tail follows (tails) a log file within a guest, like 'tail -f'.
%package -n virt-win-reg
Summary: Access and modify the Windows Registry of a Windows VM
License: GPLv2+
License: GPL-2.0-or-later
BuildArch: noarch
# This replaces the libguestfs-tools package.
@ -413,6 +409,13 @@ end
%changelog
* Mon Dec 11 2023 Richard W.M. Jones <rjones@redhat.com> - 1.51.6-1
- Rebase to guestfs-tools 1.51.6
- Implement --key all:...
resolves: RHEL-19030
- Fix crash because of off-by-one error
resolves: RHEL-19062
* Thu Jun 08 2023 Laszlo Ersek <lersek@redhat.com> - 1.50.1-3
- let virt-inspector recognize "--key /dev/mapper/VG-LV:key:password"
- reenable "make check"; we now use "-cpu max" (libguestfs 30f74f38bd6e)

View File

@ -1,2 +1,2 @@
SHA512 (guestfs-tools-1.50.1.tar.gz) = d4544dfbfbf4764f7d166fb6a97c2c3204e62aa96652020b63dd9a11233f314e811fad4a1a9dc053237b31140eaa6d30da8385c6bce4231ccc653f63afae4b89
SHA512 (guestfs-tools-1.50.1.tar.gz.sig) = c4b987e039e69f5e0aa9322d70f47fc8cb6bf36ecfcd2a5936cc66bd1fef20e50a7354423ea832b51011b0443506080d783172351ee637cc7f247125d32e3989
SHA512 (guestfs-tools-1.51.6.tar.gz) = 48e6d5bb7c8b1e6b7b9b7e59b3122b287d321d3e8e435fa65f84aab594d8cf91b0d6d50a4dde7f9265ccabc73bb3b67a8593bfd86a4fbf6b17323fe8496fc8c5
SHA512 (guestfs-tools-1.51.6.tar.gz.sig) = 341e5220a3251e019dbca20997d478f2ea49008e488f9cfa309a636502902eb3e84dbcadea5f9993e19b1066766a6e1afd1aaf2b22e74212699da66c0a9266ab