diff options
author | Denis Vlasenko | 2006-09-17 15:08:12 +0000 |
---|---|---|
committer | Denis Vlasenko | 2006-09-17 15:08:12 +0000 |
commit | c889d2b786e8bd3e6e79ed4e03de5d04d3b4b196 (patch) | |
tree | 815cc22724f2be2732300cffe06ca0151545d558 /util-linux/mount.c | |
parent | c0975199bea22a1f4f99f496ee32c3fac854bed5 (diff) | |
download | busybox-c889d2b786e8bd3e6e79ed4e03de5d04d3b4b196.zip busybox-c889d2b786e8bd3e6e79ed4e03de5d04d3b4b196.tar.gz |
mount: fix "duplicate mount options in mtab" bug
Diffstat (limited to 'util-linux/mount.c')
-rw-r--r-- | util-linux/mount.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/util-linux/mount.c b/util-linux/mount.c index 57d2d04..430ec9b 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); |