]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fstab-generator: fix options in systemd.mount-extra= arg
authorJules Lamur <contact@juleslamur.fr>
Mon, 7 Apr 2025 16:49:26 +0000 (18:49 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 7 Apr 2025 22:10:07 +0000 (07:10 +0900)
Fixes a bug introduced by 55365b0a233ae3024411fd0815ad930e20f6a3d6 (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.

src/fstab-generator/fstab-generator.c
test/test-fstab-generator/test-19-mounts-from-cmdline.expected/hoge-withx20space.mount
test/test-fstab-generator/test-20-swap-from-cmdline.expected/dev-sdy3.swap
test/test-fstab-generator/test-20-swap-from-cmdline.expected/swap.target.wants/dev-sdy3.swap [moved from test/test-fstab-generator/test-20-swap-from-cmdline.expected/swap.target.requires/dev-sdy3.swap with 100% similarity]

index 5adf48f20c7622c2df9610393f7273864502065a..88aafd95db63b8d8e6c32f0557b5353bb9809a21 100644 (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) {
index e9ffb4bbd93723d2080371a21567ad255b69c538..d3797c9706556793ea3bbcd0e72c3cf678b8ee0d 100644 (file)
@@ -9,4 +9,4 @@ Before=remote-fs.target
 What=//foo￾bar
 Where=/hoge/with space
 Type=cifs
-Options=rw
+Options=rw,seclabel
index 3b6563d2164f81016832c1b5e9daeca8dc954e67..1b4b53c9b8494d0626e93cc3b9b67f8c1565af4c 100644 (file)
@@ -7,4 +7,4 @@ After=blockdev@dev-sdy3.target
 
 [Swap]
 What=/dev/sdy3
-Options=x-systemd.makefs
+Options=x-systemd.makefs,nofail