From: Karel Zak Date: Mon, 18 Aug 2008 23:14:14 +0000 (+0200) Subject: swapon: -a has to complain, fix leaks X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b414d89359f79b128373a6c39cf44dc1e358306;p=util-linux swapon: -a has to complain, fix leaks 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 --- diff --git a/mount/swapon.c b/mount/swapon.c index f0c969b6..eb0eb4ab 100644 --- a/mount/swapon.c +++ b/mount/swapon.c @@ -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);