]> 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)
committerLuca Boccassi <luca.boccassi@gmail.com>
Sat, 17 May 2025 11:43:20 +0000 (12:43 +0100)
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.

(cherry picked from commit 06fadc4286fee6a7505a88659e5ae2e6f3ee60ba)
(cherry picked from commit 0122eae1af270baed63b258852fa26396ea00fc8)

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 b4df9d23c2a4a003174432fe89f2d8297f42a1d0..ce36162ca2f7ce4624867fa3baf89aacfa382474 100644 (file)
@@ -109,15 +109,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)
@@ -126,19 +126,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;
 
@@ -168,7 +155,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) {
@@ -186,7 +173,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