From: Davidlohr Bueso Date: Mon, 30 Aug 2010 02:03:32 +0000 (-0400) Subject: ul: fix memory leak. X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4727b16944cd67f0c9ba1acaba301ac97648a001;p=util-linux ul: fix memory leak. 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 Signed-off-by: Karel Zak --- diff --git a/text-utils/ul.c b/text-utils/ul.c index a1491b84..b409c7cd 100644 --- a/text-utils/ul.c +++ b/text-utils/ul.c @@ -46,6 +46,7 @@ #include /* for setupterm() */ #include /* for getenv() */ #include /* for INT_MAX */ +#include /* 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); +}