aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--elf/dl-load.c10
2 files changed, 13 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 9fcc7c8d03..c959b8ccc1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2000-10-28 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/dl-load.c (open_verify): Only try to load ET_DYN and ET_EXEC
+ objects. Reject all other types.
+ (_dl_map_object_from_fd): Optimize a bit.
+
2000-10-27 Ulrich Drepper <drepper@redhat.com>
* stdio-common/Makefile (tests): Add tst-fseek.
diff --git a/elf/dl-load.c b/elf/dl-load.c
index ff24463cad..e1a579186f 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -902,7 +902,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
/* Length of the sections to be loaded. */
maplength = loadcmds[nloadcmds - 1].allocend - c->mapstart;
- if (type == ET_DYN || type == ET_REL)
+ if (__builtin_expect (type, ET_DYN) == ET_DYN)
{
/* This is a position-independent shared object. We can let the
kernel map it anywhere it likes, but we must have space for all
@@ -1279,10 +1279,10 @@ open_verify (const char *name, struct filebuf *fbp)
/* XXX We should be able so set system specific versions which are
allowed here. */
if (!VALID_ELF_OSABI (ehdr->e_ident[EI_OSABI]))
- lose (0, fd, name, NULL, NULL, N_("ELF file OS ABI invalid."));
+ lose (0, fd, name, NULL, NULL, N_("ELF file OS ABI invalid"));
if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_ABIVERSION]))
lose (0, fd, name, NULL, NULL,
- N_("ELF file ABI version invalid."));
+ N_("ELF file ABI version invalid"));
lose (0, fd, name, NULL, NULL, N_("internal error"));
}
@@ -1300,6 +1300,10 @@ open_verify (const char *name, struct filebuf *fbp)
!= sizeof (ElfW(Phdr)))
lose (0, fd, name, NULL, NULL,
N_("ELF file's phentsize not the expected size"));
+ else if (__builtin_expect (ehdr->e_type, ET_DYN) != ET_DYN
+ && __builtin_expect (ehdr->e_type, ET_EXEC) != ET_EXEC)
+ lose (0, fd, name, NULL, NULL,
+ N_("only ET_DYN and ET_EXEC can be loaded"));
}
return fd;