Fix an attempt to free a static pointer when using objcopy's symbol addition feature.
authorNick Clifton <nickc@redhat.com>
Thu, 9 Jan 2020 16:51:04 +0000 (16:51 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 9 Jan 2020 16:51:04 +0000 (16:51 +0000)
PR 25220
* objcopy.c (empty_name): New variable.
(need_sym_before): Prevent an attempt to free a static variable.
(filter_symbols): Avoid strcmp test by checking for pointer
equality.

binutils/ChangeLog
binutils/objcopy.c

index 792b978a2636e84fbc27a93497006e90a70e001e..b3c499d466e9502ea4b6a2018528701188c373e0 100644 (file)
@@ -1,3 +1,11 @@
+2020-01-09  Nick Clifton  <nickc@redhat.com>
+
+       PR 25220
+       * objcopy.c (empty_name): New variable.
+       (need_sym_before): Prevent an attempt to free a static variable.
+       (filter_symbols): Avoid strcmp test by checking for pointer
+       equality.
+
 2020-01-09  Nick Clifton  <nickc@redhat.com>
 
        * po/zh_TW.po: Updated Traditional Chinese translation.
index 61b33c7e40517d937b24bf8353453a1b7d76df17..ef3b693be4916106d4afd132f50ec90b10b125dc 100644 (file)
@@ -68,7 +68,7 @@ struct addsym_node
   long      symval;
   flagword  flags;
   char *    section;
-  char *    othersym;
+  const char *  othersym;
 };
 
 typedef struct section_rename
@@ -808,7 +808,7 @@ parse_flags (const char *s)
    string can't be parsed.  */
 
 static flagword
-parse_symflags (const char *s, char **other)
+parse_symflags (const char *s, const char **other)
 {
   flagword ret;
   const char *snext;
@@ -1453,6 +1453,9 @@ is_hidden_symbol (asymbol *sym)
   return FALSE;
 }
 
+/* Empty name is hopefully never a valid symbol name.  */
+static const char * empty_name = "";
+
 static bfd_boolean
 need_sym_before (struct addsym_node **node, const char *sym)
 {
@@ -1464,10 +1467,12 @@ need_sym_before (struct addsym_node **node, const char *sym)
     {
       if (!ptr->othersym)
        break;
+      if (ptr->othersym == empty_name)
+       continue;
       else if (strcmp (ptr->othersym, sym) == 0)
        {
-         free (ptr->othersym);
-         ptr->othersym = ""; /* Empty name is hopefully never a valid symbol name.  */
+         free ((char *) ptr->othersym);
+         ptr->othersym = empty_name;
          *node = ptr;
          return TRUE;
        }
@@ -1695,7 +1700,7 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
        {
          if (ptr->othersym)
            {
-             if (strcmp (ptr->othersym, ""))
+             if (ptr->othersym != empty_name)
                fatal (_("'before=%s' not found"), ptr->othersym);
            }
          else