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:
dongshengyuan
2026-07-24 16:38:19 +08:00
parent d751846043
commit 89ad718762

View File

@@ -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="))) {