Skip to content

Commit

Permalink
fix memory leak of MMacro::iname
Browse files Browse the repository at this point in the history
When running with -fsanitize=leak enabled nasm prints these errors:

Direct leak of 25 byte(s) in 5 object(s) allocated from:
    #0 0x7f5fc494b867 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145
    netwide-assembler#1 0x55a8037f10e0 in nasm_malloc nasmlib/alloc.c:55
    netwide-assembler#2 0x55a8037f10e0 in nasm_strdup nasmlib/alloc.c:117
    netwide-assembler#3 0x55a803873172 in expand_mmacro asm/preproc.c:6905
    netwide-assembler#4 0x55a803873172 in pp_tokline asm/preproc.c:7814
    netwide-assembler#5 0x55a803873172 in pp_getline asm/preproc.c:7826
    netwide-assembler#6 0x55a8037eb5d8 in assemble_file asm/nasm.c:1722
    netwide-assembler#7 0x55a8037e5761 in main asm/nasm.c:719
    netwide-assembler#8 0x7f5fc4063d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    netwide-assembler#9 0x7f5fc4063e3f in __libc_start_main_impl ../csu/libc-start.c:392
    netwide-assembler#10 0x55a8037e7c34 in _start (/home/ivan/d/nasm/nasm+0x2e5c34)

This is reproducible on many tests, for example on zerobyte.asm.

The problem was that MMacro::iname is only allocated but never freed.
  • Loading branch information
sorokin committed Feb 26, 2023
1 parent 396295f commit 981d5c6
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions asm/preproc.c
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,7 @@ static void free_mmacro(MMacro * m)
free_tlist(m->dlist);
nasm_free(m->defaults);
free_llist(m->expansion);
nasm_free(m->iname);
nasm_free(m);
}

Expand Down Expand Up @@ -6899,6 +6900,7 @@ static int expand_mmacro(Token * tline)
m->in_progress ++;
m->params = params;
m->iline = tline;
assert(!m->iname);
m->iname = nasm_strdup(mname);
m->nparam = nparam;
m->rotate = 0;
Expand Down Expand Up @@ -7642,10 +7644,12 @@ static Token *pp_tokline(void)
nasm_free(m->params);
free_tlist(m->iline);
nasm_free(m->paramlen);
nasm_free(m->iname);
fm->in_progress = 0;
m->params = NULL;
m->iline = NULL;
m->paramlen = NULL;
m->iname = NULL;
}
}

Expand Down

0 comments on commit 981d5c6

Please sign in to comment.