From: Ulf Magnusson <ulfali...@gmail.com>

[ Upstream commit 5b1374b3b3c2fc4f63a398adfa446fb8eff791a4 ]

Only the E_NOT operand and not the E_NOT node itself was freed, due to
accidentally returning too early in expr_free(). Outline of leak:

        switch (e->type) {
        ...
        case E_NOT:
                expr_free(e->left.expr);
                return;
        ...
        }
        *Never reached, 'e' leaked*
        free(e);

Fix by changing the 'return' to a 'break'.

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

        LEAK SUMMARY:
           definitely lost: 44,448 bytes in 1,852 blocks
           ...

Summary after the fix:

        LEAK SUMMARY:
           definitely lost: 1,608 bytes in 67 blocks
           ...

Signed-off-by: Ulf Magnusson <ulfali...@gmail.com>
Signed-off-by: Masahiro Yamada <yamada.masah...@socionext.com>
Signed-off-by: Sasha Levin <alexander.le...@microsoft.com>
---
 scripts/kconfig/expr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
index 8cee597d33a5..ee23ebc881a6 100644
--- a/scripts/kconfig/expr.c
+++ b/scripts/kconfig/expr.c
@@ -113,7 +113,7 @@ void expr_free(struct expr *e)
                break;
        case E_NOT:
                expr_free(e->left.expr);
-               return;
+               break;
        case E_EQUAL:
        case E_GEQ:
        case E_GTH:
-- 
2.15.1

Reply via email to