From c59bd7550f93da2e712829d5330626c8fafa21a2 Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Fri, 24 Feb 2023 14:03:38 +0100 Subject: [PATCH] fix memory leak in eval_strfunc When running with -fsanitize=leak enabled nasm prints this error: ==19965==ERROR: LeakSanitizer: detected memory leaks Direct leak of 360 byte(s) in 90 object(s) allocated from: #0 0x7faee9396867 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145 #1 0x5645d39a401c in nasm_malloc nasmlib/alloc.c:55 #2 0x5645d3a41f9d in string_transform asm/strfunc.c:356 #3 0x5645d3a37d40 in eval_strfunc asm/eval.c:761 #4 0x5645d3a37d40 in expr6 asm/eval.c:906 #5 0x5645d3a3968d in expr5 asm/eval.c:627 #6 0x5645d3a39aca in expr4 asm/eval.c:602 #7 0x5645d3a39b72 in expr3 asm/eval.c:563 #8 0x5645d3a39db8 in expr2 asm/eval.c:537 #9 0x5645d3a39f38 in expr1 asm/eval.c:511 #10 0x5645d3a3a0b8 in expr0 asm/eval.c:485 #11 0x5645d3a3a242 in rexp3 asm/eval.c:422 #12 0x5645d3a3a508 in rexp2 asm/eval.c:396 #13 0x5645d3a3a6a8 in rexp1 asm/eval.c:369 #14 0x5645d3a3a838 in rexp0 asm/eval.c:342 #15 0x5645d3a3a838 in cexpr asm/eval.c:305 #16 0x5645d3a3ad08 in bexpr asm/eval.c:298 #17 0x5645d3a3ad08 in evaluate asm/eval.c:1032 #18 0x5645d39e4f20 in parse_line asm/parser.c:959 #19 0x5645d399e243 in assemble_file asm/nasm.c:1735 #20 0x5645d3998801 in main asm/nasm.c:719 #21 0x7faee8aaed8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 #22 0x7faee8aaee3f in __libc_start_main_impl ../csu/libc-start.c:392 #23 0x5645d399acd4 in _start (/home/ivan/d/nasm/nasm+0x2e5cd4) SUMMARY: AddressSanitizer: 360 byte(s) leaked in 90 allocation(s). This problem is reproducible on test utf.asm. The problem was caused by the fact that eval_strfunc doesn't free the string allocated by string_transform. Signed-off-by: Ivan Sorokin --- asm/eval.c | 1 + 1 file changed, 1 insertion(+) diff --git a/asm/eval.c b/asm/eval.c index 80fb4a288..c436390ce 100644 --- a/asm/eval.c +++ b/asm/eval.c @@ -766,6 +766,7 @@ static expr *eval_strfunc(enum strfunc type, const char *name) } val = readstrnum(string, string_len, &rn_warn); + nasm_free(string); if (parens) { scan(); if (tt != ')') {