summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2006-09-17 15:08:12 +0000
committerDenis Vlasenko2006-09-17 15:08:12 +0000
commitc889d2b786e8bd3e6e79ed4e03de5d04d3b4b196 (patch)
tree815cc22724f2be2732300cffe06ca0151545d558
parentc0975199bea22a1f4f99f496ee32c3fac854bed5 (diff)
downloadbusybox-c889d2b786e8bd3e6e79ed4e03de5d04d3b4b196.zip
busybox-c889d2b786e8bd3e6e79ed4e03de5d04d3b4b196.tar.gz
mount: fix "duplicate mount options in mtab" bug
-rw-r--r--util-linux/mount.c24
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);