From c889d2b786e8bd3e6e79ed4e03de5d04d3b4b196 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 17 Sep 2006 15:08:12 +0000 Subject: [PATCH] mount: fix "duplicate mount options in mtab" bug --- util-linux/mount.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/util-linux/mount.c b/util-linux/mount.c index 57d2d0430..430ec9bac 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -102,9 +102,27 @@ struct { static void append_mount_options(char **oldopts, char *newopts) { if (*oldopts && **oldopts) { - char *temp = xasprintf("%s,%s",*oldopts,newopts); - free(*oldopts); - *oldopts = temp; + /* do not insert options which are already there */ + while (newopts[0]) { + char *p; + int len = strlen(newopts); + p = strchr(newopts, ','); + if (p) len = p - newopts; + p = *oldopts; + while (1) { + if (!strncmp(p,newopts,len) && (p[len]==',' || p[len]==0)) + goto skip; + p = strchr(p,','); + if(!p) break; + p++; + } + p = xasprintf("%s,%.*s", *oldopts, len, newopts); + free(*oldopts); + *oldopts = p; +skip: + newopts += len; + while (newopts[0] == ',') newopts++; + } } else { if (ENABLE_FEATURE_CLEAN_UP) free(*oldopts); *oldopts = xstrdup(newopts); -- 2.25.1