[Libguestfs] [PATCH common v2 4/4] options: Ignore errors from guestfs_luks_uuid.

Richard W.M. Jones rjones at redhat.com
Mon Sep 7 09:41:20 UTC 2020


For BitLocker disks cryptsetup does not (yet? ever?) support reading
UUIDs and this function will fail.  This does not matter here so just
ignore the error.

Note there is no error message, cryptsetup simply returns with a bad
exit code:

><rescue> cryptsetup luksUUID /dev/sda2
><rescue> echo $?
1

Updates commit bb4a2dc17a78b53437896d4215ae82df8e11b788.
---
 options/decrypt.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/options/decrypt.c b/options/decrypt.c
index 8eb24bc..6b1c0a8 100644
--- a/options/decrypt.c
+++ b/options/decrypt.c
@@ -25,6 +25,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdbool.h>
 #include <string.h>
 #include <libintl.h>
 #include <error.h>
@@ -82,11 +83,23 @@ inspect_do_decrypt (guestfs_h *g, struct key_store *ks)
     CLEANUP_FREE char *type = guestfs_vfs_type (g, partitions[i]);
     if (type &&
         (STREQ (type, "crypto_LUKS") || STREQ (type, "BitLocker"))) {
+      bool is_bitlocker = STREQ (type, "BitLocker");
       char mapname[32];
       make_mapname (partitions[i], mapname, sizeof mapname);
 
 #ifdef GUESTFS_HAVE_LUKS_UUID
-      CLEANUP_FREE char *uuid = guestfs_luks_uuid (g, partitions[i]);
+      CLEANUP_FREE char *uuid;
+      if (!is_bitlocker)
+        uuid = guestfs_luks_uuid (g, partitions[i]);
+      else {
+        /* This may fail for Windows BitLocker disks because
+         * cryptsetup luksUUID cannot read a UUID (unclear if
+         * this is a limitation of the format or cryptsetup).
+         */
+        guestfs_push_error_handler (g, NULL, NULL);
+        uuid = guestfs_luks_uuid (g, partitions[i]);
+        guestfs_pop_error_handler (g);
+      }
 #else
       const char *uuid = NULL;
 #endif
-- 
2.27.0




More information about the Libguestfs mailing list