From d5cc4be28f9d678dab441e7cf332fedf47917ea5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 7 Feb 2017 13:08:56 +0100 Subject: [PATCH] fstab-generator: Options= applies specifier expansion Let's document that this is the case, and properly escape % when we generate Options= in the generator. Fixes: #5086 --- man/systemd.mount.xml | 6 +++--- man/systemd.swap.xml | 9 ++++----- src/fstab-generator/fstab-generator.c | 27 +++++++++++++++++++++++---- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/man/systemd.mount.xml b/man/systemd.mount.xml index 2117433bf0..8d9517a913 100644 --- a/man/systemd.mount.xml +++ b/man/systemd.mount.xml @@ -366,9 +366,9 @@ Options= - Mount options to use when mounting. This takes - a comma-separated list of options. This setting is - optional. + 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 %%. diff --git a/man/systemd.swap.xml b/man/systemd.swap.xml index cf4e1ba839..7f82d69725 100644 --- a/man/systemd.swap.xml +++ b/man/systemd.swap.xml @@ -195,12 +195,11 @@ Options= - 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 + 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 swapon8 - for more information.) + for more information.) Note that the usual specifier expansion is applied to this setting, literal percent + characters should hence be written as %%. diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 3c601a63e2..00c6b2d37b 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -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)