diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2024-04-09 16:01:16 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2024-04-16 06:32:33 -0700 |
commit | 2d4c39a885d4d12325d0a9be9e014e75a295fb25 (patch) | |
tree | ae41dbc1643deaf76ccadec0327b1474d5b8c1ad /gas/config | |
parent | aa38e605634e5ce8357d610655d6eb72c3e7d2d2 (diff) | |
download | binutils-2d4c39a885d4d12325d0a9be9e014e75a295fb25.zip binutils-2d4c39a885d4d12325d0a9be9e014e75a295fb25.tar.gz binutils-2d4c39a885d4d12325d0a9be9e014e75a295fb25.tar.bz2 |
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.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-i386.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 56b2431..1637f55 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 |