From ffebb0bbde7deae978ab3e4d3d3d90acf52b7d69 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 9 Jan 2020 16:51:04 +0000 Subject: [PATCH] Fix an attempt to free a static pointer when using objcopy's symbol addition feature. 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 | 8 ++++++++ binutils/objcopy.c | 15 ++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 792b978a263..b3c499d466e 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2020-01-09 Nick Clifton + + 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 * po/zh_TW.po: Updated Traditional Chinese translation. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 61b33c7e405..ef3b693be49 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -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 -- 2.30.2