- Resolves: CVE-2024-45779 CVE-2024-45778 CVE-2025-1118 - Resolves: CVE-2025-0677 CVE-2024-45782 CVE-2025-0690 - Resolves: CVE-2024-45783 CVE-2025-0624 CVE-2024-45776 - Resolves: CVE-2025-0622 CVE-2024-45774 CVE-2024-45775 - Resolves: CVE-2024-45781 CVE-2024-45780 - Resolves: #RHEL-79700 - Resolves: #RHEL-79341 - Resolves: #RHEL-79875 - Resolves: #RHEL-79849 - Resolves: #RHEL-79707 - Resolves: #RHEL-79857 - Resolves: #RHEL-79709 - Resolves: #RHEL-79846 - Resolves: #RHEL-75737 - Resolves: #RHEL-79713 - Resolves: #RHEL-73785 - Resolves: #RHEL-73787 - Resolves: #RHEL-79704 - Resolves: #RHEL-79702 Signed-off-by: Nicolas Frayer <nfrayer@redhat.com>
185 lines
5.6 KiB
Diff
185 lines
5.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Glenn Washburn <development@efficientek.com>
|
|
Date: Thu, 9 Dec 2021 11:14:51 -0600
|
|
Subject: [PATCH] cryptodisk: Refactor to discard have_it global
|
|
|
|
The global "have_it" was never used by the crypto-backends, but was used to
|
|
determine if a crypto-backend successfully mounted a cryptodisk with a given
|
|
UUID. This is not needed however, because grub_device_iterate() will return
|
|
1 if and only if grub_cryptodisk_scan_device() returns 1. And
|
|
grub_cryptodisk_scan_device() will now only return 1 if a search_uuid has
|
|
been specified and a cryptodisk was successfully setup by a crypto-backend or
|
|
a cryptodisk of the requested UUID is already open.
|
|
|
|
To implement this grub_cryptodisk_scan_device_real() is modified to return
|
|
a cryptodisk or NULL on failure and having the appropriate grub_errno set to
|
|
indicated failure. Note that grub_cryptodisk_scan_device_real() will fail now
|
|
with a new errno GRUB_ERR_BAD_MODULE when none of the cryptodisk backend
|
|
modules succeed in identifying the source disk.
|
|
|
|
With this change grub_device_iterate() will return 1 when a crypto device is
|
|
successfully decrypted or when the source device has already been successfully
|
|
opened. Prior to this change, trying to mount an already successfully opened
|
|
device would trigger an error with the message "no such cryptodisk found",
|
|
which is at best misleading. The mount should silently succeed in this case,
|
|
which is what happens with this patch.
|
|
|
|
Signed-off-by: Glenn Washburn <development@efficientek.com>
|
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
|
---
|
|
grub-core/disk/cryptodisk.c | 56 ++++++++++++++++++++++++++++-----------------
|
|
1 file changed, 35 insertions(+), 21 deletions(-)
|
|
|
|
diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c
|
|
index 90f82b2..9df3d31 100644
|
|
--- a/grub-core/disk/cryptodisk.c
|
|
+++ b/grub-core/disk/cryptodisk.c
|
|
@@ -983,7 +983,7 @@ grub_util_cryptodisk_get_uuid (grub_disk_t disk)
|
|
|
|
#endif
|
|
|
|
-static int check_boot, have_it;
|
|
+static int check_boot;
|
|
static char *search_uuid;
|
|
|
|
static void
|
|
@@ -995,7 +995,7 @@ cryptodisk_close (grub_cryptodisk_t dev)
|
|
grub_free (dev);
|
|
}
|
|
|
|
-static grub_err_t
|
|
+static grub_cryptodisk_t
|
|
grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source)
|
|
{
|
|
grub_err_t err;
|
|
@@ -1005,13 +1005,13 @@ grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source)
|
|
dev = grub_cryptodisk_get_by_source_disk (source);
|
|
|
|
if (dev)
|
|
- return GRUB_ERR_NONE;
|
|
+ return dev;
|
|
|
|
FOR_CRYPTODISK_DEVS (cr)
|
|
{
|
|
dev = cr->scan (source, search_uuid, check_boot);
|
|
if (grub_errno)
|
|
- return grub_errno;
|
|
+ return NULL;
|
|
if (!dev)
|
|
continue;
|
|
|
|
@@ -1019,16 +1019,16 @@ grub_cryptodisk_scan_device_real (const char *name, grub_disk_t source)
|
|
if (err)
|
|
{
|
|
cryptodisk_close (dev);
|
|
- return err;
|
|
+ return NULL;
|
|
}
|
|
|
|
grub_cryptodisk_insert (dev, name, source);
|
|
|
|
- have_it = 1;
|
|
-
|
|
- return GRUB_ERR_NONE;
|
|
+ return dev;
|
|
}
|
|
- return GRUB_ERR_NONE;
|
|
+
|
|
+ grub_error (GRUB_ERR_BAD_MODULE, "no cryptodisk module can handle this device");
|
|
+ return NULL;
|
|
}
|
|
|
|
#ifdef GRUB_UTIL
|
|
@@ -1082,8 +1082,10 @@ static int
|
|
grub_cryptodisk_scan_device (const char *name,
|
|
void *data __attribute__ ((unused)))
|
|
{
|
|
- grub_err_t err;
|
|
+ int ret = 0;
|
|
grub_disk_t source;
|
|
+ grub_cryptodisk_t dev;
|
|
+ grub_errno = GRUB_ERR_NONE;
|
|
|
|
/* Try to open disk. */
|
|
source = grub_disk_open (name);
|
|
@@ -1093,13 +1095,26 @@ grub_cryptodisk_scan_device (const char *name,
|
|
return 0;
|
|
}
|
|
|
|
- err = grub_cryptodisk_scan_device_real (name, source);
|
|
+ dev = grub_cryptodisk_scan_device_real (name, source);
|
|
+ if (dev)
|
|
+ {
|
|
+ ret = (search_uuid != NULL && grub_strcasecmp (search_uuid, dev->uuid) == 0);
|
|
+ goto cleanup;
|
|
+ }
|
|
|
|
- grub_disk_close (source);
|
|
-
|
|
- if (err)
|
|
+ /*
|
|
+ * Do not print error when err is GRUB_ERR_BAD_MODULE to avoid many unhelpful
|
|
+ * error messages.
|
|
+ */
|
|
+ if (grub_errno == GRUB_ERR_BAD_MODULE)
|
|
+ grub_error_pop ();
|
|
+
|
|
+ if (grub_errno != GRUB_ERR_NONE)
|
|
grub_print_error ();
|
|
- return have_it && search_uuid ? 1 : 0;
|
|
+
|
|
+ cleanup:
|
|
+ grub_disk_close (source);
|
|
+ return ret;
|
|
}
|
|
|
|
static grub_err_t
|
|
@@ -1110,9 +1125,9 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
|
if (argc < 1 && !state[1].set && !state[2].set)
|
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required");
|
|
|
|
- have_it = 0;
|
|
if (state[0].set)
|
|
{
|
|
+ int found_uuid;
|
|
grub_cryptodisk_t dev;
|
|
|
|
dev = grub_cryptodisk_get_by_uuid (args[0]);
|
|
@@ -1125,10 +1140,10 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
|
|
|
check_boot = state[2].set;
|
|
search_uuid = args[0];
|
|
- grub_device_iterate (&grub_cryptodisk_scan_device, NULL);
|
|
+ found_uuid = grub_device_iterate (&grub_cryptodisk_scan_device, NULL);
|
|
search_uuid = NULL;
|
|
|
|
- if (!have_it)
|
|
+ if (!found_uuid)
|
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such cryptodisk found");
|
|
return GRUB_ERR_NONE;
|
|
}
|
|
@@ -1142,7 +1157,6 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
|
}
|
|
else
|
|
{
|
|
- grub_err_t err;
|
|
grub_disk_t disk;
|
|
grub_cryptodisk_t dev;
|
|
char *diskname;
|
|
@@ -1178,13 +1192,13 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
|
return GRUB_ERR_NONE;
|
|
}
|
|
|
|
- err = grub_cryptodisk_scan_device_real (diskname, disk);
|
|
+ dev = grub_cryptodisk_scan_device_real (diskname, disk);
|
|
|
|
grub_disk_close (disk);
|
|
if (disklast)
|
|
*disklast = ')';
|
|
|
|
- return err;
|
|
+ return (dev == NULL) ? grub_errno : GRUB_ERR_NONE;
|
|
}
|
|
}
|
|
|