aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2021-04-09 22:35:17 +0000
committerWarner Losh <imp@FreeBSD.org>2021-04-09 22:36:40 +0000
commit0292a5c95f14b1ad3df39ee71c51cc830864a3aa (patch)
tree648e01411652a0b7e5f8d538c1c147323da22dc2 /usr.sbin
parent3c0dcbfc8501155af2c5461de10fd01c615524a0 (diff)
downloadsrc-0292a5c95f14b1ad3df39ee71c51cc830864a3aa.tar.gz
src-0292a5c95f14b1ad3df39ee71c51cc830864a3aa.zip
efivar: Attempt to fix setting/printing/deleting EFI vars with '-' in their name
Due to how we're parsing UUIDs, we were disallowing setting, printing or deleting any UEFI variable with a '-' in it when you attempted to do that operation with the exact name (wildcard reporting was unaffected). Fix the parser to loop over all the dashes in the name and only give up when all possible matches are exhausted. Reviewed by: markj@ Sponsored by: Netflix, Inc Differential Revision: https://reviews.freebsd.org/D29620
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/efivar/efivar.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/usr.sbin/efivar/efivar.c b/usr.sbin/efivar/efivar.c
index cbf4050a787d..2fdf0e4d09b8 100644
--- a/usr.sbin/efivar/efivar.c
+++ b/usr.sbin/efivar/efivar.c
@@ -118,15 +118,24 @@ rep_errx(int eval, const char *fmt, ...)
static void
breakdown_name(char *name, efi_guid_t *guid, char **vname)
{
- char *cp;
-
- cp = strrchr(name, '-');
- if (cp == NULL)
- rep_errx(1, "Invalid name: %s", name);
- *vname = cp + 1;
- *cp = '\0';
- if (efi_name_to_guid(name, guid) < 0)
- rep_errx(1, "Invalid guid %s", name);
+ char *cp, *ocp;
+
+ ocp = NULL;
+ while (true) {
+ cp = strrchr(name, '-');
+ if (cp == NULL) {
+ if (ocp != NULL)
+ *ocp = '-';
+ rep_errx(1, "Invalid guid in: %s", name);
+ }
+ if (ocp != NULL)
+ *ocp = '-';
+ *vname = cp + 1;
+ *cp = '\0';
+ ocp = cp;
+ if (efi_name_to_guid(name, guid) >= 0)
+ break;
+ }
}
static uint8_t *