mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
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:
@@ -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) {
|
||||
|
||||
@@ -9,4 +9,4 @@ Before=remote-fs.target
|
||||
What=//foobar
|
||||
Where=/hoge/with space
|
||||
Type=cifs
|
||||
Options=rw
|
||||
Options=rw,seclabel
|
||||
|
||||
@@ -7,4 +7,4 @@ After=blockdev@dev-sdy3.target
|
||||
|
||||
[Swap]
|
||||
What=/dev/sdy3
|
||||
Options=x-systemd.makefs
|
||||
Options=x-systemd.makefs,nofail
|
||||
|
||||
Reference in New Issue
Block a user