From 1065f77afb552c656c6116cfed099c0dae2dfe0a Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Tue, 23 Jan 2018 18:01:17 +0000 Subject: [PATCH] Fix some resource leaks. Always free dev and fstyp before strduping new values to assign to them. Free them at the end of the loop. This keeps them from leaking for mal-formed /etc/fstab lines. CID: 1007777, 1007778, 1007779 Sponsored by: Netflix --- stand/common/boot.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/stand/common/boot.c b/stand/common/boot.c index 5ee95215283..9984ad4e24c 100644 --- a/stand/common/boot.c +++ b/stand/common/boot.c @@ -319,6 +319,8 @@ getrootmount(char *rootdev) goto notfound; /* loop reading lines from /etc/fstab What was that about sscanf again? */ + fstyp = NULL; + dev = NULL; while (fgetstr(lbuf, sizeof(lbuf), fd) >= 0) { if ((lbuf[0] == 0) || (lbuf[0] == '#')) continue; @@ -330,6 +332,7 @@ getrootmount(char *rootdev) continue; /* delimit and save */ *cp++ = 0; + free(dev); dev = strdup(lbuf); /* skip whitespace up to mountpoint */ @@ -349,6 +352,7 @@ getrootmount(char *rootdev) while ((*cp != 0) && !isspace(*cp)) cp++; *cp = 0; + free(fstyp); fstyp = strdup(ep); /* skip whitespace up to mount options */ @@ -365,8 +369,6 @@ getrootmount(char *rootdev) options = strdup(ep); /* Build the : and save it in vfs.root.mountfrom */ sprintf(lbuf, "%s:%s", fstyp, dev); - free(dev); - free(fstyp); setenv("vfs.root.mountfrom", lbuf, 0); /* Don't override vfs.root.mountfrom.options if it is already set */ @@ -379,6 +381,8 @@ getrootmount(char *rootdev) break; } close(fd); + free(dev); + free(fstyp); notfound: if (error) { @@ -390,6 +394,7 @@ notfound: cp[strlen(cp) - 1] = '\0'; setenv("vfs.root.mountfrom", cp, 0); error = 0; + free(cp); } }