Sorry, I meant WRDSF_NOVAR. Updated patch attached. It's not very important issue for GNU tar, but wordsplit.c is meant to be library code - so it's worth fixing IMO.
Pavel On Friday, July 27, 2018 5:24:46 PM CEST Pavel Raiskup wrote: > * lib/wordsplit.c (expvar): Don't copy string returned from > wordsplit_find_env by strdup(), it's not needed and the value is > never freed. > --- > lib/wordsplit.c | 10 ++-------- > 1 file changed, 2 insertions(+), 8 deletions(-) > > diff --git a/lib/wordsplit.c b/lib/wordsplit.c > index f2ecada..a186f2e 100644 > --- a/lib/wordsplit.c > +++ b/lib/wordsplit.c > @@ -707,7 +707,6 @@ expvar (struct wordsplit *wsp, const char *str, size_t > len, > size_t i = 0; > const char *defstr = NULL; > const char *value; > - const char *vptr; > struct wordsplit_node *newnode; > const char *start = str - 1; > > @@ -770,13 +769,8 @@ expvar (struct wordsplit *wsp, const char *str, size_t > len, > i - its length > defstr - default replacement str */ > > - vptr = wordsplit_find_env (wsp, str, i); > - if (vptr) > - { > - value = strdup (vptr); > - if (!value) > - return _wsplt_nomem (wsp); > - } > + if ((value = wordsplit_find_env (wsp, str, i))) > + ; /* returns pointer into wsp->ws_env */ > else if (wsp->ws_flags & WRDSF_GETVAR) > value = wsp->ws_getvar (str, i, wsp->ws_closure); > else if (wsp->ws_flags & WRDSF_UNDEF) >
>From 364aeb8cdff0f966b8eab7b8abb7036155f4cdb1 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup <prais...@redhat.com> Date: Fri, 27 Jul 2018 17:21:41 +0200 Subject: [PATCH] wordsplit: avoid leak if WRDSF_NOVAR is not enabled * lib/wordsplit.c (expvar): Don't copy string returned from wordsplit_find_env by strdup (), it's not needed and the value is never freed. The only affected wordsplit () call in tar is in src/system.c. --- lib/wordsplit.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/wordsplit.c b/lib/wordsplit.c index f2ecada..a186f2e 100644 --- a/lib/wordsplit.c +++ b/lib/wordsplit.c @@ -707,7 +707,6 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, size_t i = 0; const char *defstr = NULL; const char *value; - const char *vptr; struct wordsplit_node *newnode; const char *start = str - 1; @@ -770,13 +769,8 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, i - its length defstr - default replacement str */ - vptr = wordsplit_find_env (wsp, str, i); - if (vptr) - { - value = strdup (vptr); - if (!value) - return _wsplt_nomem (wsp); - } + if ((value = wordsplit_find_env (wsp, str, i))) + ; /* returns pointer into wsp->ws_env */ else if (wsp->ws_flags & WRDSF_GETVAR) value = wsp->ws_getvar (str, i, wsp->ws_closure); else if (wsp->ws_flags & WRDSF_UNDEF) -- 2.17.1