fstab-generator: fix options in systemd.mount-extra= arg

Fixes a bug introduced by 55365b0a23 (v254).

The arguments `(rd.)systemd.mount-extra` take a value that looks like
`WHAT:WHERE[:FSTYPE[:OPTIONS]]`. The `OPTIONS` were parsed into a nulstr
where a comma-separated c-string was expected. This leads to a bug where
only the first option was taken into account by the generator.

For example, if you passed `systemd.mount-extra=/x:/y:baz:ro,defaults`
to the kernel, `systemd-fstab-generator` would translate that into a
nulstr: `ro\0defaults\0`.
Since methods processing options in the generator expected a
comma-separated c-string, they would only see the first option, `ro` in
this case.
This commit is contained in:
Jules Lamur
2025-04-07 18:49:26 +02:00
committed by Yu Watanabe
parent 5f8e5297b4
commit 06fadc4286
4 changed files with 6 additions and 19 deletions

View File

@@ -110,15 +110,15 @@ static int mount_array_add_internal(
char *in_what,
char *in_where,
const char *in_fstype,
const char *in_options) {
char *in_options) {
_cleanup_free_ char *what = NULL, *where = NULL, *fstype = NULL, *options = NULL;
int r;
/* This takes what and where. */
what = ASSERT_PTR(in_what);
where = in_where;
options = in_options;
fstype = strdup(isempty(in_fstype) ? "auto" : in_fstype);
if (!fstype)
@@ -127,19 +127,6 @@ static int mount_array_add_internal(
if (streq(fstype, "swap"))
where = mfree(where);
if (!isempty(in_options)) {
_cleanup_strv_free_ char **options_strv = NULL;
r = strv_split_full(&options_strv, in_options, ",", 0);
if (r < 0)
return r;
r = strv_make_nulstr(options_strv, &options, NULL);
} else
r = strv_make_nulstr(STRV_MAKE("defaults"), &options, NULL);
if (r < 0)
return r;
if (!GREEDY_REALLOC(arg_mounts, arg_n_mounts + 1))
return -ENOMEM;
@@ -169,7 +156,7 @@ static int mount_array_add(bool for_initrd, const char *str) {
if (!isempty(str))
return -EINVAL;
return mount_array_add_internal(for_initrd, TAKE_PTR(what), TAKE_PTR(where), fstype, options);
return mount_array_add_internal(for_initrd, TAKE_PTR(what), TAKE_PTR(where), fstype, TAKE_PTR(options));
}
static int mount_array_add_swap(bool for_initrd, const char *str) {
@@ -187,7 +174,7 @@ static int mount_array_add_swap(bool for_initrd, const char *str) {
if (!isempty(str))
return -EINVAL;
return mount_array_add_internal(for_initrd, TAKE_PTR(what), NULL, "swap", options);
return mount_array_add_internal(for_initrd, TAKE_PTR(what), NULL, "swap", TAKE_PTR(options));
}
static int write_options(FILE *f, const char *options) {

View File

@@ -9,4 +9,4 @@ Before=remote-fs.target
What=//foo￾bar
Where=/hoge/with space
Type=cifs
Options=rw
Options=rw,seclabel

View File

@@ -7,4 +7,4 @@ After=blockdev@dev-sdy3.target
[Swap]
What=/dev/sdy3
Options=x-systemd.makefs
Options=x-systemd.makefs,nofail