about summary refs log tree commit diff
path: root/elf/dl-load.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-10-28 09:16:32 +0000
committerUlrich Drepper <drepper@redhat.com>2000-10-28 09:16:32 +0000
commit9987236eb11d4976b5ce23a4c76f6ab2453c9508 (patch)
tree81efb8a1649ed020da1bf68d5dd08f4f5aa0a626 /elf/dl-load.c
parent9ffec5b234e7fe5d16f65d8655b036e64fe00bad (diff)
downloadglibc-9987236eb11d4976b5ce23a4c76f6ab2453c9508.tar.gz
glibc-9987236eb11d4976b5ce23a4c76f6ab2453c9508.tar.xz
glibc-9987236eb11d4976b5ce23a4c76f6ab2453c9508.zip
Update.
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.
Diffstat (limited to 'elf/dl-load.c')
-rw-r--r--elf/dl-load.c10
1 files changed, 7 insertions, 3 deletions
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;