diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-09-27 22:02:04 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-09-29 11:08:12 -0400 |
commit | 4f52d3fe2da7c3449b7fbfaa7c64a83354d3b56c (patch) | |
tree | 77b1151f030bb5e92b5718ef56a3f2db397c211d /src/fstab-generator | |
parent | 86b23b07c96b185126bfbf217227dad362a20c25 (diff) |
fstab-generator: properly deal with discard as non-last option
Previous code would only return correct results when discard
was the last option.
While at it, avoid incorrect behaviour for (invalid) 'pri' option
not followed by '=...', and also do not return -1 as the error code.
Diffstat (limited to 'src/fstab-generator')
-rw-r--r-- | src/fstab-generator/fstab-generator.c | 73 |
1 files changed, 54 insertions, 19 deletions
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 5569325a16..5dafcba3c0 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -46,34 +46,70 @@ static int arg_root_rw = -1; static int mount_find_pri(struct mntent *me, int *ret) { - char *end, *pri; + char *end, *opt; unsigned long r; assert(me); assert(ret); - pri = hasmntopt(me, "pri"); - if (!pri) + opt = hasmntopt(me, "pri"); + if (!opt) return 0; - pri += 4; + opt += strlen("pri"); + + if (*opt != '=') + return -EINVAL; errno = 0; - r = strtoul(pri, &end, 10); + r = strtoul(opt + 1, &end, 10); if (errno > 0) return -errno; - if (end == pri || (*end != ',' && *end != 0)) + if (end == opt + 1 || (*end != ',' && *end != 0)) return -EINVAL; *ret = (int) r; return 1; } +static int mount_find_discard(struct mntent *me, char **ret) { + char *opt, *ans; + size_t len; + + assert(me); + assert(ret); + + opt = hasmntopt(me, "discard"); + if (!opt) + return 0; + + opt += strlen("discard"); + + if (*opt == ',' || *opt == '\0') + ans = strdup("all"); + else { + if (*opt != '=') + return -EINVAL; + + len = strcspn(opt + 1, ","); + if (len == 0) + return -EINVAL; + + ans = strndup(opt + 1, len); + } + + if (!ans) + return -ENOMEM; + + *ret = ans; + return 1; +} + static int add_swap(const char *what, struct mntent *me) { _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL; _cleanup_fclose_ FILE *f = NULL; - char *discard = NULL; + _cleanup_free_ char *discard = NULL; bool noauto; int r, pri = -1; @@ -89,7 +125,13 @@ static int add_swap(const char *what, struct mntent *me) { r = mount_find_pri(me, &pri); if (r < 0) { log_error("Failed to parse priority"); - return pri; + return r; + } + + r = mount_find_discard(me, &discard); + if (r < 0) { + log_error("Failed to parse discard"); + return r; } noauto = !!hasmntopt(me, "noauto"); @@ -120,18 +162,11 @@ static int add_swap(const char *what, struct mntent *me) { "What=%s\n", what); - discard = mount_test_option(me->mnt_opts, "discard"); - if (discard) { - discard = strpbrk(discard, "="); - fprintf(f, - "Discard=%s\n", - discard ? discard+1 : "all"); - } - if (pri >= 0) - fprintf(f, - "Priority=%i\n", - pri); + fprintf(f, "Priority=%i\n", pri); + + if (discard) + fprintf(f, "Discard=%s\n", discard); fflush(f); if (ferror(f)) { |