aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2020-01-09 16:51:04 +0000
committerNick Clifton <nickc@redhat.com>2020-01-09 16:51:04 +0000
commitffebb0bbde7deae978ab3e4d3d3d90acf52b7d69 (patch)
tree946ffa070c8a85a538d86c3576a6e7fab0eedd22 /binutils
parentb899eb3bb807be1094fde9a2f1c8628232bc0743 (diff)
downloadbinutils-ffebb0bbde7deae978ab3e4d3d3d90acf52b7d69.zip
binutils-ffebb0bbde7deae978ab3e4d3d3d90acf52b7d69.tar.gz
binutils-ffebb0bbde7deae978ab3e4d3d3d90acf52b7d69.tar.bz2
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.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog8
-rw-r--r--binutils/objcopy.c15
2 files changed, 18 insertions, 5 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 792b978..b3c499d 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,5 +1,13 @@
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.
2020-01-09 Aaron Merey <amerey@redhat.com>
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 61b33c7..ef3b693 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