Don't leak memory when displaying help.

Right now, we'll leak memory when we display a help topic because we
don't free t, s, d that we've just used when breaking out of the loop.
NB: coverity just reported t, but s and d also leak.

CID: 1007776
This commit is contained in:
Warner Losh 2018-01-23 18:01:27 +00:00
parent 1065f77afb
commit 74ecc44117

View File

@ -91,10 +91,8 @@ help_getnext(int fd, char **topic, char **subtopic, char **desc)
cp = ep; cp = ep;
} }
if (*topic == NULL) { if (*topic == NULL) {
if (*subtopic != NULL) free(*subtopic);
free(*subtopic); free(*desc);
if (*desc != NULL)
free(*desc);
continue; continue;
} }
return(1); return(1);
@ -169,7 +167,7 @@ command_help(int argc, char *argv[])
} else if (strcmp(topic, t)) { } else if (strcmp(topic, t)) {
/* topic mismatch */ /* topic mismatch */
if(matched) /* nothing more on this topic, stop scanning */ if (matched) /* nothing more on this topic, stop scanning */
break; break;
} else { } else {
@ -178,7 +176,7 @@ command_help(int argc, char *argv[])
if (((subtopic == NULL) && (s == NULL)) || if (((subtopic == NULL) && (s == NULL)) ||
((subtopic != NULL) && (s != NULL) && !strcmp(subtopic, s))) { ((subtopic != NULL) && (s != NULL) && !strcmp(subtopic, s))) {
/* exact match, print text */ /* exact match, print text */
while((fgetstr(buf, 80, hfd) >= 0) && (buf[0] != '#')) { while ((fgetstr(buf, 80, hfd) >= 0) && (buf[0] != '#')) {
if (pager_output(buf)) if (pager_output(buf))
break; break;
if (pager_output("\n")) if (pager_output("\n"))
@ -193,24 +191,25 @@ command_help(int argc, char *argv[])
free(t); free(t);
free(s); free(s);
free(d); free(d);
t = s = d = NULL;
} }
free(t);
free(s);
free(d);
pager_close(); pager_close();
close(hfd); close(hfd);
if (!matched) { if (!matched) {
snprintf(command_errbuf, sizeof(command_errbuf), snprintf(command_errbuf, sizeof(command_errbuf),
"no help available for '%s'", topic); "no help available for '%s'", topic);
free(topic); free(topic);
if (subtopic) free(subtopic);
free(subtopic);
return(CMD_ERROR); return(CMD_ERROR);
} }
free(topic); free(topic);
if (subtopic) free(subtopic);
free(subtopic);
return(CMD_OK); return(CMD_OK);
} }
COMMAND_SET(commandlist, "?", "list commands", command_commandlist); COMMAND_SET(commandlist, "?", "list commands", command_commandlist);
/* /*