changed parseopts to not modify the "char *cp" argument. It was
[nfs-utils.git] / support / nfs / exports.c
index 702df23..078c806 100644 (file)
@@ -253,12 +253,11 @@ updateexportent(struct exportent *eep, char *options)
 }
 
 /*
- * Parse option string pointed to by s and set mount options accordingly.
+ * Parse option string pointed to by cp and set mount options accordingly.
  */
 static int
 parseopts(char *cp, struct exportent *ep)
 {
-       char    *opt;
 
        squids = ep->e_squids; nsquids = ep->e_nsquids;
        sqgids = ep->e_sqgids; nsqgids = ep->e_nsqgids;
@@ -266,11 +265,14 @@ parseopts(char *cp, struct exportent *ep)
        while (isblank(*cp))
                cp++;
        while (*cp) {
-               opt = cp;
+               char *opt = strdup(cp);
+               char *optstart = cp;
                while (*cp && *cp != ',')
                        cp++;
-               if (*cp)
-                       *cp++ = '\0';
+               if (*cp) {
+                       opt[cp-optstart] = '\0';
+                       cp++;
+               }
 
                /* process keyword */
                if (strcmp(opt, "ro") == 0)
@@ -316,18 +318,24 @@ parseopts(char *cp, struct exportent *ep)
                else if (strncmp(opt, "anongid=", 8) == 0)
                        ep->e_anongid = atoi(opt+8);
                else if (strncmp(opt, "squash_uids=", 12) == 0) {
-                       if (parsesquash(opt+12, &squids, &nsquids, &cp) < 0)
+                       if (parsesquash(opt+12, &squids, &nsquids, &cp) < 0) {
+                               free(opt);
                                return -1;
+                       }
                } else if (strncmp(opt, "squash_gids=", 12) == 0) {
-                       if (parsesquash(opt+12, &sqgids, &nsqgids, &cp) < 0)
+                       if (parsesquash(opt+12, &sqgids, &nsqgids, &cp) < 0) {
+                               free(opt);
                                return -1;
+                       }
                } else {
                        xlog(L_ERROR,
                                "Unknown keyword \"%s\" in export file\n",
                                opt);
                        ep->e_flags |= NFSEXP_ALLSQUASH | NFSEXP_READONLY;
+                       free(opt);
                        return -1;
                }
+               free(opt);
                while (isblank(*cp))
                        cp++;
        }