mirror of
git://sourceware.org/git/glibc.git
synced 2025-02-17 13:00:43 +08:00
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.
This commit is contained in:
parent
51e623f241
commit
cc00cecef5
@ -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>
|
2014-10-28 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
[BZ #14132]
|
[BZ #14132]
|
||||||
|
@ -112,20 +112,6 @@ static const size_t system_dirs_len[] =
|
|||||||
(sizeof (system_dirs_len) / sizeof (system_dirs_len[0]))
|
(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
|
static bool
|
||||||
is_trusted_path (const char *path, size_t len)
|
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 we do not have to replace anything simply copy the string. */
|
||||||
if (__glibc_likely (cnt == 0))
|
if (__glibc_likely (cnt == 0))
|
||||||
return local_strdup (s);
|
return __strdup (s);
|
||||||
|
|
||||||
/* Determine the length of the substituted string. */
|
/* Determine the length of the substituted string. */
|
||||||
total = DL_DST_REQUIRED (l, s, strlen (s), cnt);
|
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. */
|
/* Make a writable copy. */
|
||||||
copy = local_strdup (rpath);
|
copy = __strdup (rpath);
|
||||||
if (copy == NULL)
|
if (copy == NULL)
|
||||||
{
|
{
|
||||||
errstring = N_("cannot create RUNPATH/RPATH copy");
|
errstring = N_("cannot create RUNPATH/RPATH copy");
|
||||||
@ -2101,7 +2087,7 @@ _dl_map_object (struct link_map *loader, const char *name,
|
|||||||
false);
|
false);
|
||||||
if (__glibc_likely (fd != -1))
|
if (__glibc_likely (fd != -1))
|
||||||
{
|
{
|
||||||
realname = local_strdup (cached);
|
realname = __strdup (cached);
|
||||||
if (realname == NULL)
|
if (realname == NULL)
|
||||||
{
|
{
|
||||||
__close (fd);
|
__close (fd);
|
||||||
@ -2130,7 +2116,7 @@ _dl_map_object (struct link_map *loader, const char *name,
|
|||||||
/* The path may contain dynamic string tokens. */
|
/* The path may contain dynamic string tokens. */
|
||||||
realname = (loader
|
realname = (loader
|
||||||
? expand_dynamic_string_token (loader, name, 0)
|
? expand_dynamic_string_token (loader, name, 0)
|
||||||
: local_strdup (name));
|
: __strdup (name));
|
||||||
if (realname == NULL)
|
if (realname == NULL)
|
||||||
fd = -1;
|
fd = -1;
|
||||||
else
|
else
|
||||||
@ -2164,7 +2150,7 @@ _dl_map_object (struct link_map *loader, const char *name,
|
|||||||
static const Elf_Symndx dummy_bucket = STN_UNDEF;
|
static const Elf_Symndx dummy_bucket = STN_UNDEF;
|
||||||
|
|
||||||
/* Allocate a new object map. */
|
/* 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,
|
|| (l = _dl_new_object (name_copy, name, type, loader,
|
||||||
mode, nsid)) == NULL)
|
mode, nsid)) == NULL)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user