1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

update from main archive 960814

This commit is contained in:
Ulrich Drepper
1996-08-15 01:23:29 +00:00
parent 046e3001f9
commit 706074a5bb
30 changed files with 2083 additions and 263 deletions

View File

@ -70,11 +70,25 @@ int _dl_zerofd = -1;
size_t _dl_pagesize;
/* Local version of `strdup' function. */
static inline 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);
}
/* Map in the shared object NAME, actually located in REALNAME, and already
opened on FD. */
struct link_map *
_dl_map_object_from_fd (const char *name, int fd, char *realname,
_dl_map_object_from_fd (char *name, int fd, char *realname,
struct link_map *loader, int l_type)
{
struct link_map *l = NULL;
@ -96,6 +110,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
l->l_next->l_prev = l->l_prev;
free (l);
}
free (name);
free (realname);
_dl_signal_error (code, name, msg);
}
@ -142,6 +157,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
/* The object is already loaded.
Just bump its reference count and return it. */
__close (fd);
free (name);
free (realname);
++l->l_opencount;
return l;
@ -524,11 +540,8 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
fd = __open (cached, O_RDONLY);
if (fd != -1)
{
size_t cl = strlen (cached) + 1;
realname = malloc (cl);
if (realname)
memcpy (realname, cached, cl);
else
realname = local_strdup (cached);
if (realname == NULL)
{
__close (fd);
fd = -1;
@ -548,11 +561,8 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
fd = __open (name, O_RDONLY);
if (fd != -1)
{
size_t len = strlen (name) + 1;
realname = malloc (len);
if (realname)
memcpy (realname, name, len);
else
realname = local_strdup (name);
if (realname == NULL)
{
__close (fd);
fd = -1;
@ -560,6 +570,16 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
}
}
if (fd != -1)
{
name = local_strdup (name);
if (name == NULL)
{
__close (fd);
fd = -1;
}
}
if (fd == -1)
_dl_signal_error (errno, name, "cannot open shared object file");