about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-10-27 21:33:40 +0000
committerUlrich Drepper <drepper@redhat.com>2004-10-27 21:33:40 +0000
commit32738a227007c089581a62621c673dceabd1c08d (patch)
tree25cc0ed7c3e521930ac8ef538b37b54e0903b2cc /elf
parentb1f68750871f1d447fb7d36b24590084239730b5 (diff)
downloadglibc-32738a227007c089581a62621c673dceabd1c08d.tar.gz
glibc-32738a227007c089581a62621c673dceabd1c08d.tar.xz
glibc-32738a227007c089581a62621c673dceabd1c08d.zip
Update.
2004-10-27  Jakub Jelinek  <jakub@redhat.com>

	* include/resolv.h (_res_opcodes): New extern.
	Add libresolv_hidden_proto.
	* resolv/res_debug.c (_res_opcodes): Remove.
	(__p_class_syms, __p_type_syms): Add libresolv_hidden_proto
	and libresolv_hidden_data_def.  Remove attribute_hidden.
	* resolv/res_mkquery (_res_opcodes): Remove.
	* resolv/res_data.c (_res_opcodes): Remove attribute_hidden.
	Add libresolv_hidden_data_def.

	* elf/dl-open.c (_dl_open): Don't allow explicitly opening a DSO
	into an empty namespace.
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-open.c6
-rw-r--r--elf/tst-dlmopen3.c23
2 files changed, 29 insertions, 0 deletions
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 2ab1e307a4..294a523aac 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -570,6 +570,12 @@ _dl_open (const char *file, int mode, const void *caller_dlopen, Lmid_t nsid)
 no more namespaces available for dlmopen()"));
 	}
     }
+  /* Never allow loading a DSO in a namespace which is empty.  Such
+     direct placements is only causing problems.  */
+  else if (nsid != LM_ID_BASE && nsid != __LM_ID_CALLER
+	   && GL(dl_ns)[nsid]._ns_nloaded == 0)
+    GLRO(dl_signal_error) (EINVAL, file, NULL,
+			   N_("invalid target namespace in dlmopen()"));
 
   args.file = file;
   args.mode = mode;
diff --git a/elf/tst-dlmopen3.c b/elf/tst-dlmopen3.c
new file mode 100644
index 0000000000..da951ca806
--- /dev/null
+++ b/elf/tst-dlmopen3.c
@@ -0,0 +1,23 @@
+#include <dlfcn.h>
+#include <stdio.h>
+#include <gnu/lib-names.h>
+
+
+static int
+do_test (void)
+{
+  void *h = dlmopen (LM_ID_NEWLM, "$ORIGIN/tst-dlmopen1mod.so", RTLD_LAZY);
+  if (h == NULL)
+    {
+      printf ("cannot get handle for %s: %s\n",
+	      "tst-dlmopen1mod.so", dlerror ());
+      return 1;
+    }
+
+  /* Do not unload.  */
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"