]> err.no Git - util-linux/commitdiff
swapon: -a has to complain, fix leaks
authorKarel Zak <kzak@redhat.com>
Mon, 18 Aug 2008 23:14:14 +0000 (01:14 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 18 Aug 2008 23:22:02 +0000 (01:22 +0200)
The "swapon -a" command (without "-e" option) has to complain always
when LABEL or UUID does not exist.

Test:

# grep foo /etc/fstab
LABEL=foo swap swap defaults 0 0

   Old version:

# swapon -a; echo $?
0

   Fixed version:

# swapon -a; echo $?
swapon: cannot find the device for LABEL=foo
255

# swapon -a -e; echo $?
0

This version also fix two memory leaks.

Signed-off-by: Karel Zak <kzak@redhat.com>
mount/swapon.c

index f0c969b619567be3f405ec4ae79e006776d39675..eb0eb4aba3c994fa32a9d7a130593b3031532234 100644 (file)
@@ -400,29 +400,37 @@ swapon_all(void) {
                const char *special;
                int skip = 0;
                int pri = priority;
+               char *opt, *opts;
 
                if (!streq(fstab->mnt_type, MNTTYPE_SWAP))
                        continue;
 
+               opts = strdup(fstab->mnt_opts);
+
+               for (opt = strtok(opts, ","); opt != NULL;
+                    opt = strtok(NULL, ",")) {
+                       if (strncmp(opt, "pri=", 4) == 0)
+                               pri = atoi(opt+4);
+                       if (strcmp(opt, "noauto") == 0)
+                               skip = 1;
+               }
+               free(opts);
+
+               if (skip)
+                       continue;
+
                special = fsprobe_get_devname(fstab->mnt_fsname);
-               if (!special)
+               if (!special) {
+                       if (!ifexists)
+                               status |= cannot_find(fstab->mnt_fsname);
                        continue;
+               }
 
                if (!is_in_proc_swaps(special) &&
-                   (!ifexists || !access(special, R_OK))) {
-                       /* parse mount options; */
-                       char *opt, *opts = strdup(fstab->mnt_opts);
-
-                       for (opt = strtok(opts, ","); opt != NULL;
-                            opt = strtok(NULL, ",")) {
-                               if (strncmp(opt, "pri=", 4) == 0)
-                                       pri = atoi(opt+4);
-                               if (strcmp(opt, "noauto") == 0)
-                                       skip = 1;
-                       }
-                       if (!skip)
-                               status |= do_swapon(special, pri, CANONIC);
-               }
+                   (!ifexists || !access(special, R_OK)))
+                       status |= do_swapon(special, pri, CANONIC);
+
+               free((void *) special);
        }
        fclose(fp);