about summary refs log tree commit diff
path: root/elf/dl-sym.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/dl-sym.c')
-rw-r--r--elf/dl-sym.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/elf/dl-sym.c b/elf/dl-sym.c
index ffc36bc8f9..9ca2af81e4 100644
--- a/elf/dl-sym.c
+++ b/elf/dl-sym.c
@@ -41,7 +41,7 @@ _dl_sym (void *handle, const char *name, void *who)
 
   /* Find the highest-addressed object that CALLER is not below.  */
   for (l = _dl_loaded; l != NULL; l = l->l_next)
-    if (l->l_addr != 0 && caller >= l->l_map_start && caller < l->l_map_end)
+    if (caller >= l->l_map_start && caller < l->l_map_end)
       {
 	/* There must be exactly one DSO for the range of the virtual
 	   memory.  Otherwise something is really broken.  */
@@ -65,8 +65,13 @@ _dl_sym (void *handle, const char *name, void *who)
       else
 	{
 	  if (__builtin_expect (match == _dl_loaded, 0))
-	    _dl_signal_error (0, NULL, N_("\
+	    {
+	      if (! _dl_loaded
+		  || caller < _dl_loaded->l_map_start
+		  || caller >= _dl_loaded->l_map_end)
+	        _dl_signal_error (0, NULL, N_("\
 RTLD_NEXT used in code not dynamically loaded"));
+	    }
 
 	  l = match;
 	  while (l->l_loader != NULL)
@@ -107,7 +112,7 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)
 
   /* Find the highest-addressed object that CALLER is not below.  */
   for (l = _dl_loaded; l != NULL; l = l->l_next)
-    if (l->l_addr != 0 && caller >= l->l_map_start && caller < l->l_map_end)
+    if (caller >= l->l_map_start && caller < l->l_map_end)
       {
 	/* There must be exactly one DSO for the range of the virtual
 	   memory.  Otherwise something is really broken.  */
@@ -121,9 +126,14 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)
 					  &vers, 0, 0);
   else if (handle == RTLD_NEXT)
     {
-      if (match == _dl_loaded)
-	_dl_signal_error (0, NULL, N_("\
+      if (__builtin_expect (match == _dl_loaded, 0))
+	{
+	  if (! _dl_loaded
+	      || caller < _dl_loaded->l_map_start
+	      || caller >= _dl_loaded->l_map_end)
+	    _dl_signal_error (0, NULL, N_("\
 RTLD_NEXT used in code not dynamically loaded"));
+	}
 
       l = match;
       while (l->l_loader != NULL)