diff options
author | Carlos O'Donell <carlos@redhat.com> | 2014-10-28 19:37:07 -0400 |
---|---|---|
committer | Carlos O'Donell <carlos@redhat.com> | 2014-10-28 19:46:15 -0400 |
commit | cc00cecef5cca965191cd8f75aec85d6b4bb399a (patch) | |
tree | 2d2b8d5479307a5f65b575e227434c856d569dc6 | |
parent | 51e623f2419c9f33423fa8e36ed9a9ff0d05e17e (diff) | |
download | glibc-cc00cecef5cca965191cd8f75aec85d6b4bb399a.zip glibc-cc00cecef5cca965191cd8f75aec85d6b4bb399a.tar.gz glibc-cc00cecef5cca965191cd8f75aec85d6b4bb399a.tar.bz2 |
elf/dl-load.c: Use __strdup.
During a refactoring pass several repeated blocks of code in dl-load.c
were turned into a call to a local function named local_strdup. There
is no need for local_strdup, and the routines should instead call
__strdup. This change does just that. We call the internal symbol
__strdup because calling strdup is unsafe. The user might be
using a standard that doesn't include strdup and may have defined this
symbol in their application. During a static link we might reference
the user defined symbol and crash if it doesn't implement a standards
conforming strdup. The resulting code is simpler to understand, and
makes it easier to debug.
No regressions on x86_64.
2014-10-28 Carlos O'Donell <carlos@redhat.com>
* dl-load.c (local_strdup): Remove.
(expand_dynamic_string_token): Use __strdup.
(decompose_rpath): Likewise.
(_dl_map_object): Likewise.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | elf/dl-load.c | 24 |
2 files changed, 12 insertions, 19 deletions
@@ -1,3 +1,10 @@ +2014-10-28 Carlos O'Donell <carlos@redhat.com> + + * dl-load.c (local_strdup): Remove. + (expand_dynamic_string_token): Use __strdup. + (decompose_rpath): Likewise. + (_dl_map_object): Likewise. + 2014-10-28 Joseph Myers <joseph@codesourcery.com> [BZ #14132] diff --git a/elf/dl-load.c b/elf/dl-load.c index 9dd40e3..ce5b626 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -112,20 +112,6 @@ static const size_t system_dirs_len[] = (sizeof (system_dirs_len) / sizeof (system_dirs_len[0])) -/* Local version of `strdup' function. */ -static char * -local_strdup (const char *s) -{ - size_t len = strlen (s) + 1; - void *new = malloc (len); - - if (new == NULL) - return NULL; - - return (char *) memcpy (new, s, len); -} - - static bool is_trusted_path (const char *path, size_t len) { @@ -384,7 +370,7 @@ expand_dynamic_string_token (struct link_map *l, const char *s, int is_path) /* If we do not have to replace anything simply copy the string. */ if (__glibc_likely (cnt == 0)) - return local_strdup (s); + return __strdup (s); /* Determine the length of the substituted string. */ total = DL_DST_REQUIRED (l, s, strlen (s), cnt); @@ -593,7 +579,7 @@ decompose_rpath (struct r_search_path_struct *sps, } /* Make a writable copy. */ - copy = local_strdup (rpath); + copy = __strdup (rpath); if (copy == NULL) { errstring = N_("cannot create RUNPATH/RPATH copy"); @@ -2101,7 +2087,7 @@ _dl_map_object (struct link_map *loader, const char *name, false); if (__glibc_likely (fd != -1)) { - realname = local_strdup (cached); + realname = __strdup (cached); if (realname == NULL) { __close (fd); @@ -2130,7 +2116,7 @@ _dl_map_object (struct link_map *loader, const char *name, /* The path may contain dynamic string tokens. */ realname = (loader ? expand_dynamic_string_token (loader, name, 0) - : local_strdup (name)); + : __strdup (name)); if (realname == NULL) fd = -1; else @@ -2164,7 +2150,7 @@ _dl_map_object (struct link_map *loader, const char *name, static const Elf_Symndx dummy_bucket = STN_UNDEF; /* Allocate a new object map. */ - if ((name_copy = local_strdup (name)) == NULL + if ((name_copy = __strdup (name)) == NULL || (l = _dl_new_object (name_copy, name, type, loader, mode, nsid)) == NULL) { |