mirror of
https://github.com/systemd/systemd.git
synced 2026-08-13 17:08:14 +00:00
cryptsetup: don't keep invalid size= values
size= is specified in bits, but arg_key_size stores bytes after
parsing. The parser used arg_key_size as temporary storage before
validation. When the value was not divisible by 8, the warning said
the option was ignored, but the invalid bit count remained.
Parse into a local variable and update arg_key_size only after
validation.
Repro:
build/systemd-cryptsetup attach sdscan /tmp/plain.img /tmp/key \
plain,size=7
Before: warned ignored, then used key size 56 bits.
After: warned ignored, then kept the default key size 256 bits.
Follow-up for: 6131a78b4d
This commit is contained in:
@@ -193,19 +193,20 @@ static int parse_one_option(const char *option) {
|
||||
return log_oom();
|
||||
|
||||
} else if ((val = startswith(option, "size="))) {
|
||||
unsigned key_size;
|
||||
|
||||
r = safe_atou(val, &arg_key_size);
|
||||
r = safe_atou(val, &key_size);
|
||||
if (r < 0) {
|
||||
log_warning_errno(r, "Failed to parse %s, ignoring: %m", option);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (arg_key_size % 8) {
|
||||
if (key_size % 8) {
|
||||
log_warning("size= not a multiple of 8, ignoring.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
arg_key_size /= 8;
|
||||
arg_key_size = key_size / 8;
|
||||
|
||||
} else if ((val = startswith(option, "sector-size="))) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user