summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-11-21 16:28:35 +1100
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-11-24 13:30:01 +1100
commita23c3271090ddb9004678b8ede3b2ba8f83d7acf (patch)
treef1d4d149381a7ba4db89ed023f4568c8a6b75db5
parent9f29eb2eff09d7bf74905b1fef8eaf4f7934219e (diff)
downloadpetitboot-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.c19
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 */
OpenPOWER on IntegriCloud