diff options
author | Samuel Mendoza-Jonas <sam@mendozajonas.com> | 2016-11-21 16:28:35 +1100 |
---|---|---|
committer | Samuel Mendoza-Jonas <sam@mendozajonas.com> | 2016-11-24 13:30:01 +1100 |
commit | a23c3271090ddb9004678b8ede3b2ba8f83d7acf (patch) | |
tree | f1d4d149381a7ba4db89ed023f4568c8a6b75db5 | |
parent | 9f29eb2eff09d7bf74905b1fef8eaf4f7934219e (diff) | |
download | petitboot-a23c3271090ddb9004678b8ede3b2ba8f83d7acf.zip petitboot-a23c3271090ddb9004678b8ede3b2ba8f83d7acf.tar.gz |
discover/platform-powerpc: Reject bootdevs with empty UUIDs
If a "uuid:" label is set in the petitboot,bootdevs or petitboot,bootdev
parameters without a matching UUID, the UUID is unintentionally accepted
and set to NULL. This can cause a segfault in nc-config when device
UUIDs are compared against the autoboot option. Instead treat options
like this as malformed.
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
-rw-r--r-- | discover/platform-powerpc.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c index 8fca5bd..e253dd6 100644 --- a/discover/platform-powerpc.c +++ b/discover/platform-powerpc.c @@ -412,11 +412,9 @@ static int read_bootdev(void *ctx, char **pos, struct autoboot_option *opt) if (!strncmp(*pos, "uuid:", strlen("uuid:"))) { prefix = strlen("uuid:"); opt->boot_type = BOOT_DEVICE_UUID; - rc = 0; } else if (!strncmp(*pos, "mac:", strlen("mac:"))) { prefix = strlen("mac:"); opt->boot_type = BOOT_DEVICE_UUID; - rc = 0; } else { type = find_device_type(*pos); if (type != DEVICE_TYPE_UNKNOWN) { @@ -430,9 +428,12 @@ static int read_bootdev(void *ctx, char **pos, struct autoboot_option *opt) if (delim) len = (int)(delim - *pos) - prefix; else - len = strlen(*pos); + len = strlen(*pos) - prefix; - opt->uuid = talloc_strndup(ctx, *pos + prefix, len); + if (len) { + opt->uuid = talloc_strndup(ctx, *pos + prefix, len); + rc = 0; + } } /* Always advance pointer to next option or end */ @@ -452,17 +453,19 @@ static void populate_bootdev_config(struct platform_powerpc *platform, unsigned int n_new = 0; const char *val; bool conflict; + size_t len = 0; /* Check for old-style bootdev */ val = get_param(platform, "petitboot,bootdev"); if (val && strlen(val)) { pos = talloc_strdup(config, val); if (!strncmp(val, "uuid:", strlen("uuid:"))) - old_dev = talloc_strdup(config, - val + strlen("uuid:")); + len = strlen("uuid:"); else if (!strncmp(val, "mac:", strlen("mac:"))) - old_dev = talloc_strdup(config, - val + strlen("mac:")); + len = strlen("mac:"); + /* Make sure someone hasn't set a blank UUID */ + if (len && *(val + len) != '\0') + old_dev = talloc_strdup(config, val + len); } /* Check for ordered bootdevs */ |