aboutsummaryrefslogtreecommitdiff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-misc.c6
-rw-r--r--elf/rtld.c18
2 files changed, 16 insertions, 8 deletions
diff --git a/elf/dl-misc.c b/elf/dl-misc.c
index 0894a72..86a0c63 100644
--- a/elf/dl-misc.c
+++ b/elf/dl-misc.c
@@ -1,5 +1,5 @@
/* Miscellaneous support functions for dynamic linker
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -47,7 +47,9 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
int fd = __open (file, O_RDONLY);
if (fd < 0)
return NULL;
- if (__fxstat (_STAT_VER, fd, &st) < 0)
+ if (__fxstat (_STAT_VER, fd, &st) < 0
+ /* No need to map the file if it is empty. */
+ || st.st_size == 0)
result = NULL;
else
{
diff --git a/elf/rtld.c b/elf/rtld.c
index 72c2520..e0d3521 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1,5 +1,5 @@
/* Run time dynamic linker.
- Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -532,24 +532,27 @@ of this helper program; chances are you did not intend to run this program.\n",
/* We have one problematic case: if we have a name at the end of
the file without a trailing terminating characters, we cannot
place the \0. Handle the case separately. */
- if (file[file_size - 1] != ' ' && file[file_size] != '\t'
- && file[file_size] != '\n')
+ if (file[file_size - 1] != ' ' && file[file_size - 1] != '\t'
+ && file[file_size - 1] != '\n' && file[file_size - 1] != ':')
{
problem = &file[file_size];
while (problem > file && problem[-1] != ' ' && problem[-1] != '\t'
- && problem[-1] != '\n')
+ && problem[-1] != '\n' && problem[-1] != ':')
--problem;
if (problem > file)
problem[-1] = '\0';
}
else
- problem = NULL;
+ {
+ problem = NULL;
+ file[file_size - 1] = '\0';
+ }
if (file != problem)
{
char *p;
- runp = file;
+ runp = file + strspn (file, ": \t\n");
while ((p = strsep (&runp, ": \t\n")) != NULL)
{
struct link_map *new_map = _dl_map_object (NULL, p,
@@ -557,6 +560,9 @@ of this helper program; chances are you did not intend to run this program.\n",
if (new_map->l_opencount == 1)
/* It is no duplicate. */
++npreloads;
+
+ if (runp != NULL)
+ runp += strspn (runp, ": \t\n");
}
}