From c50f84ef752e84afa9dec93617be78663901a69f Mon Sep 17 00:00:00 2001 From: bert Date: Sun, 13 Mar 2016 17:17:10 +0100 Subject: [PATCH] Resource strdups() are leaky. Signed-off-by: bert --- src/free_atexit.c | 12 ++++++++++++ src/free_atexit.h | 2 ++ src/res_lex.l | 9 +++++---- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/free_atexit.c b/src/free_atexit.c index 6c9b94d3f8..ac49c000e6 100644 --- a/src/free_atexit.c +++ b/src/free_atexit.c @@ -110,6 +110,18 @@ void *leaky_realloc (void* old_memory, size_t size) } /*! + * \brief strdup() using leaky_malloc(). + */ +char * +leaky_strdup (const char *src) +{ + int len = strlen (src)+1; + char *res = leaky_malloc (len); + memcpy (res, src, len); + return res; +} + +/*! * \brief Free all allocations. */ void leaky_uninit (void) diff --git a/src/free_atexit.h b/src/free_atexit.h index 1aa47d086e..bb5d6e7ff3 100644 --- a/src/free_atexit.h +++ b/src/free_atexit.h @@ -20,6 +20,7 @@ #define leaky_malloc(size) malloc(size) #define leaky_calloc(nmemb, size) calloc(nmemb, size) #define leaky_realloc(old_memory, size) realloc(old_memory, size) +#define leaky_strdup(str) strdup(str) #else void leaky_init (void); @@ -27,6 +28,7 @@ void leaky_uninit (void); void *leaky_malloc (size_t size); void *leaky_calloc (size_t nmemb, size_t size); void *leaky_realloc (void* old_memory, size_t size); +char *leaky_strdup (const char *src); #endif diff --git a/src/res_lex.l b/src/res_lex.l index dd4dadd56c..0c254f325a 100644 --- a/src/res_lex.l +++ b/src/res_lex.l @@ -11,6 +11,7 @@ #include "global.h" #include "resource.h" #include "res_parse.h" +#include "free_atexit.h" #ifdef HAVE_LIBDMALLOC #include @@ -39,21 +40,21 @@ COMMENT #[^\n]* %% -\"[^"]*\" { reslval.sval = strdup(yytext+1); +\"[^"]*\" { reslval.sval = leaky_strdup (yytext+1); reslval.sval[strlen(reslval.sval) - 1] = 0; return STRING; } -\'[^']*\' { reslval.sval = strdup(yytext+1); +\'[^']*\' { reslval.sval = leaky_strdup (yytext+1); reslval.sval[strlen(reslval.sval) - 1] = 0; return STRING; } {COMMENT}\n { res_lineno++; } [ \t\r\n] { if (yytext[0] == '\n') res_lineno++; } -{INCSTR} { reslval.sval = strdup(yytext); +{INCSTR} { reslval.sval = leaky_strdup (yytext); return INCLUDE; } -{PARENSTR} { reslval.sval = strdup(yytext); +{PARENSTR} { reslval.sval = leaky_strdup (yytext); return STRING; } . { return yytext[0]; } -- 2.11.4.GIT