mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-25 15:31:05 +00:00
57426168ad
Signed-off-by: Alexey Neyman <stilor@att.net>
37 lines
1.5 KiB
Diff
37 lines
1.5 KiB
Diff
commit 328c44c3670ebf6c1bd790acddce65a12998cd6c
|
|
Author: Roland McGrath <roland@hack.frob.com>
|
|
Date: Fri Apr 17 12:11:58 2015 -0700
|
|
|
|
Fuller check for invalid NSID in _dl_open.
|
|
|
|
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
|
index 0dbe07f..2d0e082 100644
|
|
--- a/elf/dl-open.c
|
|
+++ b/elf/dl-open.c
|
|
@@ -211,7 +211,7 @@ dl_open_worker (void *a)
|
|
struct link_map *l = _dl_find_dso_for_object ((ElfW(Addr)) caller_dlopen);
|
|
|
|
if (l)
|
|
- call_map = l;
|
|
+ call_map = l;
|
|
|
|
if (args->nsid == __LM_ID_CALLER)
|
|
args->nsid = call_map->l_ns;
|
|
@@ -619,8 +619,14 @@ no more namespaces available for dlmopen()"));
|
|
/* Never allow loading a DSO in a namespace which is empty. Such
|
|
direct placements is only causing problems. Also don't allow
|
|
loading into a namespace used for auditing. */
|
|
- else if (__builtin_expect (nsid != LM_ID_BASE && nsid != __LM_ID_CALLER, 0)
|
|
- && (GL(dl_ns)[nsid]._ns_nloaded == 0
|
|
+ else if (__glibc_unlikely (nsid != LM_ID_BASE && nsid != __LM_ID_CALLER)
|
|
+ && (__glibc_unlikely (nsid < 0 || nsid >= GL(dl_nns))
|
|
+ /* This prevents the [NSID] index expressions from being
|
|
+ evaluated, so the compiler won't think that we are
|
|
+ accessing an invalid index here in the !SHARED case where
|
|
+ DL_NNS is 1 and so any NSID != 0 is invalid. */
|
|
+ || DL_NNS == 1
|
|
+ || GL(dl_ns)[nsid]._ns_nloaded == 0
|
|
|| GL(dl_ns)[nsid]._ns_loaded->l_auditing))
|
|
_dl_signal_error (EINVAL, file, NULL,
|
|
N_("invalid target namespace in dlmopen()"));
|