]> err.no Git - util-linux/commitdiff
mount: fix parsing offset= followed by more options
authorPetr Uzel <petr.uzel@suse.cz>
Wed, 26 Jan 2011 11:17:00 +0000 (12:17 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 31 Jan 2011 16:12:49 +0000 (17:12 +0100)
mount does not parse parse offset= option if it is followed by other
options.  In umount, the parsing is done with the get_value() function.
This patch moves get_value to fstab.c (with new name get_option_value())
and fixes mount to use the function.

[kzak@redhat.com: - rename to get_option_value()
  - use fstab.c rather than sundries.c]

Novell bugzilla: #666150

Reported-by: Ludwig Nussel <ludwig.nussel@suse.de>
Signed-off-by: Petr Uzel <petr.uzel@suse.cz>
Signed-off-by: Karel Zak <kzak@redhat.com>
mount/fstab.c
mount/fstab.h
mount/mount.c
mount/umount.c

index 26d3fc29129d0722a542a85405230e0f5b254ebd..069a4084c5e337f622b4d751cf0252e3d7ef722c 100644 (file)
@@ -760,6 +760,7 @@ lock_mtab (void) {
        }
 }
 
+/* returns whole option with name @optname from @src list */
 static char *
 get_option(const char *optname, const char *src, size_t *len)
 {
@@ -786,6 +787,25 @@ get_option(const char *optname, const char *src, size_t *len)
        return NULL;
 }
 
+ /* If @list contains "user=peter" and @s is "user=", return "peter" */
+char *
+get_option_value(const char *list, const char *s)
+{
+       const char *t;
+       size_t n = strlen(s);
+
+       while (list && *list) {
+               if (strncmp(list, s, n) == 0) {
+                       s = t = list + n;
+                       while (*s && *s != ',')
+                               s++;
+                       return xstrndup(t, s-t);
+               }
+               while (*list && *list++ != ',') ;
+       }
+       return NULL;
+}
+
 static int
 cpy_option(const char *optname, char *dest, const char *src)
 {
index 850cb67a56e859a0b7224b7f3d7ee97b004c7855..f631bebe3af28d7ad5dacf5339abd602ec731423 100644 (file)
@@ -39,4 +39,6 @@ void lock_mtab (void);
 void unlock_mtab (void);
 void update_mtab (const char *special, struct my_mntent *with);
 
+char *get_option_value(const char *list, const char *s);
+
 #endif /* MOUNT_FSTAB_H */
index bb4bd3476eedacfce0d04854f5f914f38329110d..9fd92480d797d8b85fc927fe4a3f679ddcdf2c2e 100644 (file)
@@ -2042,16 +2042,17 @@ is_fstab_entry_mounted(struct mntentchn *mc, int verbose)
        if ((strstr(mc->m.mnt_opts, "loop=") ||
             (stat(mc->m.mnt_fsname, &st) == 0 && S_ISREG(st.st_mode)))) {
 
-               char *p = strstr(mc->m.mnt_opts, "offset=");
+               char *p = get_option_value(mc->m.mnt_opts, "offset=");
                uintmax_t offset = 0;
 
-               if (p && strtosize(p + 7, &offset) != 0) {
+               if (p && strtosize(p, &offset) != 0) {
                        if (verbose)
                                printf(_("mount: ignore %s "
                                        "(unparsable offset= option)\n"),
                                        mc->m.mnt_fsname);
                        return -1;
                }
+               free(p);
                if (is_mounted_same_loopfile(mc->m.mnt_dir, mc->m.mnt_fsname, offset))
                        goto yes;
        }
index 079aa337be5bae816e2d55c3e0a4af16b15219cd..468fb60134ca0764ee2246bdad0da37b5e8790b3 100644 (file)
@@ -455,26 +455,6 @@ contains(const char *list, const char *s) {
        return 0;
 }
 
-/*
- * If list contains "user=peter" and we ask for "user=", return "peter"
- */
-static char *
-get_value(const char *list, const char *s) {
-       const char *t;
-       int n = strlen(s);
-
-       while (list && *list) {
-               if (strncmp(list, s, n) == 0) {
-                       s = t = list+n;
-                       while (*s && *s != ',')
-                               s++;
-                       return xstrndup(t, s-t);
-               }
-               while (*list && *list++ != ',') ;
-       }
-       return NULL;
-}
-
 /* check if @mc contains a loop device which is associated
  * with the @file in fs
  */
@@ -494,7 +474,7 @@ is_valid_loop(struct mntentchn *mc, struct mntentchn *fs)
                return 0;
 
        /* check for offset option in fstab */
-       p = get_value(fs->m.mnt_opts, "offset=");
+       p = get_option_value(fs->m.mnt_opts, "offset=");
        if (p && strtosize(p, &offset)) {
                if (verbose > 1)
                        printf(_("failed to parse 'offset=%s' options\n"), p);
@@ -572,7 +552,8 @@ umount_file (char *arg) {
                        char *uhelper = NULL;
 
                        if (mc->m.mnt_opts)
-                               uhelper = get_value(mc->m.mnt_opts, "uhelper=");
+                               uhelper = get_option_value(mc->m.mnt_opts,
+                                                          "uhelper=");
                        if (uhelper) {
                                int status = 0;
                                if (check_special_umountprog(arg, arg,
@@ -641,7 +622,7 @@ umount_file (char *arg) {
                        options = mc->m.mnt_opts;
                        if (!options)
                                options = "";
-                       mtab_user = get_value(options, "user=");
+                       mtab_user = get_option_value(options, "user=");
 
                        if (user && mtab_user && streq (user, mtab_user))
                                ok = 1;