From 9c379f2ef7ad8f450366c4a33a9a081f1cbf3680 Mon Sep 17 00:00:00 2001 From: green Date: Mon, 18 Oct 1999 03:52:20 +0000 Subject: Fix a few things. Unbogosify a free(), {,UN}MARK with correct args, and fix count checks. Submitted by: Martin Blapp --- sbin/umount/umount.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'sbin/umount') diff --git a/sbin/umount/umount.c b/sbin/umount/umount.c index 5ea7c94..02a3ed4 100644 --- a/sbin/umount/umount.c +++ b/sbin/umount/umount.c @@ -187,13 +187,17 @@ main(int argc, char *argv[]) int umountall(char **typelist) { + struct vfsconf vfc; struct fstab *fs; int rval; char *cp; - struct vfsconf vfc; + static int firstcall = 1; - if ((fs = getfsent()) != NULL) - errx(1, "fstab reading failure"); + if ((fs = getfsent()) != NULL) { + if (firstcall) + errx(1, "fstab reading failure"); + firstcall = 0; + } do { /* Ignore the root. */ if (strcmp(fs->fs_file, "/") == 0) @@ -223,9 +227,10 @@ umountall(char **typelist) err(1, "malloc failed"); (void)strcpy(cp, fs->fs_file); rval = umountall(typelist); - return (umountfs(cp, typelist) || rval); + rval = umountfs(cp, typelist) || rval; + free(cp); + return (rval); } while ((fs = getfsent()) != NULL); - free(cp); return (0); } @@ -240,11 +245,12 @@ umountfs(char *name, char **typelist) size_t len; int so, speclen; char *mntonname, *mntfromname; - char *mntfromnamerev, *mntonnamerev; + char *mntfromnamerev; char *nfsdirname, *orignfsdirname; char *resolved, realname[MAXPATHLEN + 1]; char *type, *delimp, *hostp, *origname; + len = 0; mntfromname = mntonname = delimp = hostp = orignfsdirname = NULL; /* @@ -352,16 +358,12 @@ umountfs(char *name, char **typelist) * same as the normal ones. */ if ((mntfromnamerev = strdup(getmntname(getmntname(mntfromname, - NULL, MNTON, &type, NAME), NULL, - MNTFROM, &type, NAME))) == NULL) - err(1, "strdup"); - if ((mntonnamerev = strdup(getmntname(mntfromnamerev, NULL, - MNTON, &type, NAME))) == NULL) + NULL, MNTON, &type, NAME), NULL, MNTFROM, &type, NAME))) == NULL) err(1, "strdup"); /* * Mark the uppermost mount as unmounted. */ - (void)getmntname(mntfromnamerev, mntonnamerev, NOTHING, &type, MARK); + (void)getmntname(mntfromname, mntonname, NOTHING, &type, MARK); /* * If several equal mounts are in the mounttable, check the order * and warn the user if necessary. @@ -373,11 +375,10 @@ umountfs(char *name, char **typelist) mntonname, mntfromnamerev); /* call getmntname again to set mntcheck[i] to 0 */ - (void)getmntname(mntfromnamerev, mntonnamerev, + (void)getmntname(mntfromname, mntonname, NOTHING, &type, UNMARK); return (1); } - free(mntonnamerev); free(mntfromnamerev); /* * Check if we have to start the rpc-call later. @@ -390,9 +391,9 @@ umountfs(char *name, char **typelist) if (getmntname(mntfromname, NULL, NOTHING, &type, COUNT) == NULL) count = 1; + else + count = 0; } - else - count = 0; if (!namematch(hp)) return (1); if (unmount(mntonname, fflag) != 0 ) { @@ -514,7 +515,7 @@ getmntname(const char *fromname, const char *onname, count++; } /* Mark the already unmounted mounts and return - * mntfromname if count == 1. Else return NULL. + * mntfromname if count <= 1. Else return NULL. */ for (i = mntsize - 1; i >= 0; i--) { if (strcmp(mntbuf[i].f_mntfromname, fromname) == 0) { @@ -522,13 +523,12 @@ getmntname(const char *fromname, const char *onname, count--; else mntcount[i] = 1; - if (count == 1) - return (mntbuf[i].f_mntonname); - else - return (NULL); } } - return (NULL); + if (count <= 1) + return (mntbuf[i].f_mntonname); + else + return (NULL); case FREE: free(mntbuf); free(mntcheck); -- cgit v1.1