+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.
+
2004-10-27 Ulrich Drepper <drepper@redhat.com>
+ * elf/dl-open.c (_dl_open): Don't allow explicitly opening a DSO
+ into an empty namespace.
+
* elf/dl-fini.c (_dl_fini): Fix search for map in maps array.
Reverse order of namespaces.
* elf/Makefile: Add rules to build and run tst-dlmopen3.
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;
--- /dev/null
+#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"
libresolv_hidden_proto (__ns_get16)
libresolv_hidden_proto (__ns_get32)
+extern const char *_res_opcodes[];
+libresolv_hidden_proto (_res_opcodes)
+
#endif
#endif
#include <string.h>
#include <unistd.h>
-const char *_res_opcodes[] attribute_hidden = {
+const char *_res_opcodes[] = {
"QUERY",
"IQUERY",
"CQUERYM",
"ZONEINIT",
"ZONEREF",
};
+libresolv_hidden_data_def (_res_opcodes)
#ifdef BIND_UPDATE
const char *_res_sectioncodes[] attribute_hidden = {
# define SPRINTF(x) sprintf x
#endif
-extern const char *_res_opcodes[] attribute_hidden;
extern const char *_res_sectioncodes[] attribute_hidden;
/*
* that C_ANY is a qclass but not a class. (You can ask for records of class
* C_ANY, but you can't have any records of that class in the database.)
*/
-const struct res_sym __p_class_syms[] attribute_hidden = {
+extern const struct res_sym __p_class_syms[];
+libresolv_hidden_proto (__p_class_syms)
+const struct res_sym __p_class_syms[] = {
{C_IN, "IN"},
{C_CHAOS, "CHAOS"},
{C_HS, "HS"},
{C_NONE, "NONE"},
{C_IN, (char *)0}
};
+libresolv_hidden_data_def (__p_class_syms)
/*
* Names of message sections.
* that T_ANY is a qtype but not a type. (You can ask for records of type
* T_ANY, but you can't have any records of that type in the database.)
*/
-const struct res_sym __p_type_syms[] attribute_hidden = {
+extern const struct res_sym __p_type_syms[];
+libresolv_hidden_proto (__p_type_syms)
+const struct res_sym __p_type_syms[] = {
{ns_t_a, "A", "address"},
{ns_t_ns, "NS", "name server"},
{ns_t_md, "MD", "mail destination (deprecated)"},
{ns_t_any, "ANY", "\"any\""},
{0, NULL, NULL}
};
+libresolv_hidden_data_def (__p_type_syms)
/*
* Names of DNS rcodes.
# endif
#endif
-extern const char *_res_opcodes[];
-
/*
* Form all types of queries.
* Returns the size of the result or -1.