]> err.no Git - util-linux/commitdiff
ul: fix memory leak.
authorDavidlohr Bueso <dave@gnu.org>
Mon, 30 Aug 2010 02:03:32 +0000 (22:03 -0400)
committerKarel Zak <kzak@redhat.com>
Fri, 17 Sep 2010 08:02:36 +0000 (10:02 +0200)
The 'obuf' variable is not being freed after usage and this includes
when SIGINTs occur, hence add some basic signal handling.

[kzak@redhat.com - remove if-before-free ]

Signed-off-by: Davidlohr Bueso <dave@gnu.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
text-utils/ul.c

index a1491b846fcee8abb0305e26c01d2c05b01230ba..b409c7cd70f0a0437d04cd3696f716b8b0f41ff8 100644 (file)
@@ -46,6 +46,7 @@
 #include <term.h>              /* for setupterm() */
 #include <stdlib.h>            /* for getenv() */
 #include <limits.h>            /* for INT_MAX */
+#include <signal.h>            /* for signal() */
 #include "nls.h"
 
 #include "widechar.h"
@@ -75,6 +76,8 @@ void outc(wint_t c, int width);
 void setmode(int newmode);
 static void setcol(int newcol);
 static void needcol(int col);
+static void exitbuf(void);
+static void sig_handler(int signo);
 
 #define        IESC    '\033'
 #define        SO      '\016'
@@ -122,6 +125,9 @@ int main(int argc, char **argv)
        bindtextdomain(PACKAGE, LOCALEDIR);
        textdomain(PACKAGE);
 
+       signal(SIGINT, sig_handler);
+       signal(SIGTERM, sig_handler);
+
        termtype = getenv("TERM");
        if (termtype == NULL || (argv[0][0] == 'c' && !isatty(1)))
                termtype = "lpr";
@@ -168,12 +174,16 @@ int main(int argc, char **argv)
                f = fopen(argv[optind],"r");
                if (f == NULL) {
                        perror(argv[optind]);
+                       exitbuf();
                        exit(1);
                } else
                        filter(f);
        }
-       if (ferror(stdout) || fclose(stdout))
+       if (ferror(stdout) || fclose(stdout)) {
+               exitbuf();
                return 1;
+       }
+       exitbuf();
        return 0;
 }
 
@@ -601,3 +611,14 @@ needcol(int col) {
                }
        }
 }
+
+static void sig_handler(int signo)
+{
+       exitbuf();
+       exit(EXIT_SUCCESS);
+}
+
+static void exitbuf(void)
+{
+       free(obuf);
+}