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);
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to