fstab-generator: Options= applies specifier expansion
authorLennart Poettering <lennart@poettering.net>
Tue, 7 Feb 2017 12:08:56 +0000 (13:08 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 8 Feb 2017 16:20:35 +0000 (17:20 +0100)
Let's document that this is the case, and properly escape % when we
generate Options= in the generator.

Fixes: #5086

man/systemd.mount.xml
man/systemd.swap.xml
src/fstab-generator/fstab-generator.c

index 2117433..8d9517a 100644 (file)
       <varlistentry>
         <term><varname>Options=</varname></term>
 
-        <listitem><para>Mount options to use when mounting. This takes
-        a comma-separated list of options. This setting is
-        optional.</para></listitem>
+        <listitem><para>Mount options to use when mounting. This takes a comma-separated list of options. This setting
+        is optional. Note that the usual specifier expansion is applied to this setting, literal percent characters
+        should hence be written as <literal>%%</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index cf4e1ba..7f82d69 100644 (file)
       <varlistentry>
         <term><varname>Options=</varname></term>
 
-        <listitem><para>May contain an option string for the swap
-        device. This may be used for controlling discard options among
-        other functionality, if the swap backing device supports the
-        discard or trim operation. (See
+        <listitem><para>May contain an option string for the swap device. This may be used for controlling discard
+        options among other functionality, if the swap backing device supports the discard or trim operation. (See
         <citerefentry project='man-pages'><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>
-        for more information.) </para></listitem>
+        for more information.) Note that the usual specifier expansion is applied to this setting, literal percent
+        characters should hence be written as <literal>%%</literal>.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 3c601a6..00c6b2d 100644 (file)
@@ -57,6 +57,23 @@ static char *arg_usr_fstype = NULL;
 static char *arg_usr_options = NULL;
 static VolatileMode arg_volatile_mode = _VOLATILE_MODE_INVALID;
 
+static int write_options(FILE *f, const char *options) {
+        _cleanup_free_ char *o = NULL;
+
+        if (isempty(options))
+                return 0;
+
+        if (streq(options, "defaults"))
+                return 0;
+
+        o = strreplace(options, "%", "%%");
+        if (!o)
+                return log_oom();
+
+        fprintf(f, "Options=%s\n", o);
+        return 1;
+}
+
 static int add_swap(
                 const char *what,
                 struct mntent *me,
@@ -105,8 +122,9 @@ static int add_swap(
                 "What=%s\n",
                 what);
 
-        if (!isempty(me->mnt_opts) && !streq(me->mnt_opts, "defaults"))
-                fprintf(f, "Options=%s\n", me->mnt_opts);
+        r = write_options(f, me->mnt_opts);
+        if (r < 0)
+                return r;
 
         r = fflush_and_check(f);
         if (r < 0)
@@ -347,8 +365,9 @@ static int add_mount(
         if (r < 0)
                 return r;
 
-        if (!isempty(filtered) && !streq(filtered, "defaults"))
-                fprintf(f, "Options=%s\n", filtered);
+        r = write_options(f, filtered);
+        if (r < 0)
+                return r;
 
         r = fflush_and_check(f);
         if (r < 0)