diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-12-18 20:04:13 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-12-18 20:04:13 +0100 |
commit | 8e1472d2c1e25e6eabc2059170731365f6d5b3d1 (patch) | |
tree | 5b29308e6b00178a34422b6f7bb7b4f9252801dc /dlfcn | |
parent | 49b036bce9f021ae994a85aee8b410d20b29c8b7 (diff) | |
download | glibc-8e1472d2c1e25e6eabc2059170731365f6d5b3d1.tar.gz glibc-8e1472d2c1e25e6eabc2059170731365f6d5b3d1.tar.xz glibc-8e1472d2c1e25e6eabc2059170731365f6d5b3d1.zip |
ld.so: Examine GLRO to detect inactive loader [BZ #20204]
GLRO (_rtld_global_ro) is read-only after initialization and can therefore not be patched at run time, unlike the hook table addresses and their contents, so this is a desirable hardening feature. The hooks are only needed if ld.so has not been initialized, and this happens only after static dlopen (dlmopen uses a single ld.so object across all namespaces). Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'dlfcn')
-rw-r--r-- | dlfcn/dladdr.c | 3 | ||||
-rw-r--r-- | dlfcn/dladdr1.c | 3 | ||||
-rw-r--r-- | dlfcn/dlclose.c | 2 | ||||
-rw-r--r-- | dlfcn/dlerror.c | 2 | ||||
-rw-r--r-- | dlfcn/dlinfo.c | 2 | ||||
-rw-r--r-- | dlfcn/dlmopen.c | 2 | ||||
-rw-r--r-- | dlfcn/dlopen.c | 2 | ||||
-rw-r--r-- | dlfcn/dlopenold.c | 2 | ||||
-rw-r--r-- | dlfcn/dlsym.c | 2 | ||||
-rw-r--r-- | dlfcn/dlvsym.c | 2 |
10 files changed, 12 insertions, 10 deletions
diff --git a/dlfcn/dladdr.c b/dlfcn/dladdr.c index 1753434160..1bebd00240 100644 --- a/dlfcn/dladdr.c +++ b/dlfcn/dladdr.c @@ -17,6 +17,7 @@ <http://www.gnu.org/licenses/>. */ #include <dlfcn.h> +#include <ldsodefs.h> #if !defined SHARED && IS_IN (libdl) @@ -32,7 +33,7 @@ int __dladdr (const void *address, Dl_info *info) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dladdr (address, info); # endif return _dl_addr (address, info, NULL, NULL); diff --git a/dlfcn/dladdr1.c b/dlfcn/dladdr1.c index a19f9fdea2..901cf43f6b 100644 --- a/dlfcn/dladdr1.c +++ b/dlfcn/dladdr1.c @@ -17,6 +17,7 @@ <http://www.gnu.org/licenses/>. */ #include <dlfcn.h> +#include <ldsodefs.h> #if !defined SHARED && IS_IN (libdl) @@ -32,7 +33,7 @@ int __dladdr1 (const void *address, Dl_info *info, void **extra, int flags) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dladdr1 (address, info, extra, flags); # endif diff --git a/dlfcn/dlclose.c b/dlfcn/dlclose.c index da66e20488..223887d338 100644 --- a/dlfcn/dlclose.c +++ b/dlfcn/dlclose.c @@ -39,7 +39,7 @@ int __dlclose (void *handle) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlclose (handle); # endif diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c index fb5012ee85..b33c05095a 100644 --- a/dlfcn/dlerror.c +++ b/dlfcn/dlerror.c @@ -63,7 +63,7 @@ __dlerror (void) struct dl_action_result *result; # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlerror (); # endif diff --git a/dlfcn/dlinfo.c b/dlfcn/dlinfo.c index a34e947ed3..b011257468 100644 --- a/dlfcn/dlinfo.c +++ b/dlfcn/dlinfo.c @@ -111,7 +111,7 @@ int __dlinfo (void *handle, int request, void *arg DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlinfo (handle, request, arg, DL_CALLER); # endif diff --git a/dlfcn/dlmopen.c b/dlfcn/dlmopen.c index 07d59ade30..58f88bb7c6 100644 --- a/dlfcn/dlmopen.c +++ b/dlfcn/dlmopen.c @@ -79,7 +79,7 @@ void * __dlmopen (Lmid_t nsid, const char *file, int mode DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlmopen (nsid, file, mode, RETURN_ADDRESS (0)); # endif diff --git a/dlfcn/dlopen.c b/dlfcn/dlopen.c index 22120655d2..73651a8430 100644 --- a/dlfcn/dlopen.c +++ b/dlfcn/dlopen.c @@ -74,7 +74,7 @@ void * __dlopen (const char *file, int mode DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlopen (file, mode, DL_CALLER); # endif diff --git a/dlfcn/dlopenold.c b/dlfcn/dlopenold.c index a3db500705..d899c4e890 100644 --- a/dlfcn/dlopenold.c +++ b/dlfcn/dlopenold.c @@ -70,7 +70,7 @@ __dlopen_nocheck (const char *file, int mode) mode |= RTLD_LAZY; args.mode = mode; - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlopen (file, mode, RETURN_ADDRESS (0)); return _dlerror_run (dlopen_doit, &args) ? NULL : args.new; diff --git a/dlfcn/dlsym.c b/dlfcn/dlsym.c index 7976c5f75c..19733a0f19 100644 --- a/dlfcn/dlsym.c +++ b/dlfcn/dlsym.c @@ -55,7 +55,7 @@ void * __dlsym (void *handle, const char *name DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlsym (handle, name, DL_CALLER); # endif diff --git a/dlfcn/dlvsym.c b/dlfcn/dlvsym.c index 5ed220b77c..ad46b65023 100644 --- a/dlfcn/dlvsym.c +++ b/dlfcn/dlvsym.c @@ -58,7 +58,7 @@ __dlvsym (void *handle, const char *name, const char *version_str DL_CALLER_DECL) { # ifdef SHARED - if (__glibc_unlikely (_dlfcn_hook != NULL)) + if (!rtld_active ()) return _dlfcn_hook->dlvsym (handle, name, version_str, DL_CALLER); # endif |