svn commit: r328289 - head/stand/common

Warner Losh imp at FreeBSD.org
Tue Jan 23 18:01:30 UTC 2018


Author: imp
Date: Tue Jan 23 18:01:27 2018
New Revision: 328289
URL: https://svnweb.freebsd.org/changeset/base/328289

Log:
  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

Modified:
  head/stand/common/commands.c

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


More information about the svn-src-head mailing list