>From f75b9fbeb52ba64d80779280d040d47d63e01e76 Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso <dave@xxxxxxx> Date: Sun, 29 Aug 2010 22:03:32 -0400 Subject: [PATCH] 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. Signed-off-by: Davidlohr Bueso <dave@xxxxxxx> --- text-utils/ul.c | 23 ++++++++++++++++++++++- 1 files changed, 22 insertions(+), 1 deletions(-) diff --git a/text-utils/ul.c b/text-utils/ul.c index a1491b8..354926e 100644 --- a/text-utils/ul.c +++ b/text-utils/ul.c @@ -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) +{ + if (obuf) free(obuf); +} -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html