]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
x86: Fix a memory leak in md_assemble
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 9 Apr 2024 23:01:16 +0000 (16:01 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 16 Apr 2024 13:32:33 +0000 (06:32 -0700)
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.

gas/config/tc-i386.c

index 56b2431b1bcbdaf2d6378b0e9ce0d03d4669431b..1637f55759c04ca528998fed2b2a732bff8e640c 100644 (file)
@@ -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