From: H.J. Lu Date: Tue, 9 Apr 2024 23:01:16 +0000 (-0700) Subject: x86: Fix a memory leak in md_assemble X-Git-Tag: gdb-15-branchpoint~396 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d4c39a885d4d12325d0a9be9e014e75a295fb25;p=thirdparty%2Fbinutils-gdb.git x86: Fix a memory leak in md_assemble Fix a memory leak in md_assemble where copy may be cleared and may be the same as copy: if (copy && !mnem_suffix) { line = copy; copy = NULL; no_match: * config/tc-i386.c (md_assemble): Properly free the xstrdup memory. --- diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 56b2431b1bc..1637f55759c 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -6515,6 +6515,7 @@ md_assemble (char *line) { unsigned int j; char mnemonic[MAX_MNEM_SIZE], mnem_suffix = 0, *copy = NULL; + char *xstrdup_copy = NULL; const char *end, *pass1_mnem = NULL; enum i386_error pass1_err = 0; const insn_template *t; @@ -6553,10 +6554,12 @@ md_assemble (char *line) return; } t = current_templates.start; - if (may_need_pass2 (t)) + /* NB: LINE may be change to be the same as XSTRDUP_COPY. */ + if (xstrdup_copy != line && may_need_pass2 (t)) { /* Make a copy of the full line in case we need to retry. */ - copy = xstrdup (line); + xstrdup_copy = xstrdup (line); + copy = xstrdup_copy; } line += end - line; mnem_suffix = i.suffix; @@ -6565,7 +6568,7 @@ md_assemble (char *line) this_operand = -1; if (line == NULL) { - free (copy); + free (xstrdup_copy); return; } @@ -6650,7 +6653,7 @@ md_assemble (char *line) pass1_mnem = NULL; match_error: - free (copy); + free (xstrdup_copy); switch (pass1_mnem ? pass1_err : i.error) { @@ -6782,7 +6785,7 @@ md_assemble (char *line) return; } - free (copy); + free (xstrdup_copy); if (sse_check != check_none /* The opcode space check isn't strictly needed; it's there only to