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
This commit is contained in:
Warner Losh 2018-01-23 18:01:17 +00:00
parent 25f0135c49
commit 1065f77afb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=328288

View file

@ -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 <fstype>:<device> 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 @@ getrootmount(char *rootdev)
cp[strlen(cp) - 1] = '\0';
setenv("vfs.root.mountfrom", cp, 0);
error = 0;
free(cp);
}
}