kconfig: Don't leak 'source' filenames during parsing
authorUlf Magnusson <ulfalizer@gmail.com>
Sun, 8 Oct 2017 17:11:19 +0000 (19:11 +0200)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 10 Feb 2019 20:46:27 +0000 (21:46 +0100)
The 'source_stmt' nonterminal takes a 'prompt', which consists of either
a T_WORD or a T_WORD_QUOTE, both of which are always allocated on the
heap in zconf.l and need to have their associated strings freed. Free
them.

The existing code already makes sure to always copy the string, but add
a warning to sym_expand_string_value() to make it clear that the string
must be copied, just in case.

Summary from Valgrind on 'menuconfig' (ARCH=x86) before the fix:

LEAK SUMMARY:
   definitely lost: 387,504 bytes in 15,545 blocks
   ...

Summary after the fix:

LEAK SUMMARY:
   definitely lost: 344,616 bytes in 14,355 blocks
   ...

Signed-off-by: Ulf Magnusson <ulfalizer@gmail.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/symbol.c
config/zconf.y

index 35e0937aa6a6fd3b47f15974f6df121c41c55488..55c95e0bb48a546c7fddd5fae42d9f7855ad840b 100644 (file)
@@ -907,6 +907,10 @@ const char *sym_expand_string_value(const char *in)
        char *res;
        size_t reslen;
 
+       /*
+        * Note: 'in' might come from a token that's about to be
+        * freed, so make sure to always allocate a new string
+        */
        reslen = strlen(in) + 1;
        res = xmalloc(reslen);
        res[0] = '\0';
index 27b9b3f119789d176d5f46823de5fa1037195933..7ca795404d38e2860f8c3cb046c2bbaea7c506e4 100644 (file)
@@ -393,6 +393,7 @@ source_stmt: T_SOURCE prompt T_EOL
 {
        printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
        zconf_nextfile($2);
+       free($2);
 };
 
 /* comment entry */