Compare commits

...

No commits in common. "imports/c8s/apr-1.6.3-10.el8" and "c8" have entirely different histories.

2 changed files with 61 additions and 6 deletions

View File

@ -1,11 +1,60 @@
Add $APR_DEEPBIND to enable use of RTLD_DEEPBIND in apr_dso_open().
--- apr-1.4.8/dso/unix/dso.c.deepbind
+++ apr-1.4.8/dso/unix/dso.c
@@ -123,7 +123,7 @@
void *os_handle = dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL);
@@ -38,6 +38,8 @@
#define DYLD_LIBRARY_HANDLE (void *)-1
#endif
+static int use_deepbind; /* 0 = unset, 1 = use DEEPBIND, -1, don't use DEEPBIND */
+
APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso,
apr_os_dso_handle_t osdso,
apr_pool_t *pool)
@@ -125,6 +127,12 @@
#else
- int flags = RTLD_NOW | RTLD_GLOBAL;
+ int flags = RTLD_NOW | RTLD_GLOBAL | RTLD_DEEPBIND;
int flags = RTLD_NOW | RTLD_GLOBAL;
void *os_handle;
+
+ if (use_deepbind == 0)
+ use_deepbind = getenv("APR_DEEPBIND") != NULL ? 1 : -1;
+ if (use_deepbind == 1)
+ flags |= RTLD_DEEPBIND;
+
#ifdef _AIX
if (strchr(path + 1, '(') && path[strlen(path) - 1] == ')')
{
--- apr-1.7.0/README.deepbind.deepbind
+++ apr-1.7.0/README.deepbind
@@ -0,0 +1,30 @@
+This distribution of APR contains a modification of the behaviour of
+the apr_dso_open() function which allows users enable the
+"RTLD_DEEPBIND" flag when dlopen() is called.
+
+If the "APR_DEEPBIND" environment variable is set at runtime, the
+RTLD_DEEPBIND flag is always added to the flags passed to dlopen().
+
+With normal use of dlopen(), dynamically loaded objects will use
+global symbols in preference to any symbols defined within the object.
+Using RTLD_DEEPBIND reverses this binding order. See the dlopen(3)
+man page for more information.
+
+This can be useful with Apache httpd, where two different modules are
+loaded like:
+
+1. mod_foo.so uses library "libfoo.so"
+ libfoo.so defines a function "SomeSym"
+2. mod_bar.so uses library "libbar.so"
+ libbar.so defines a different "SomeSym" function
+
+By default, mod_bar or mod_foo would use the "SomeSym" definition from
+the "wrong" library depending on the load order. If RTLD_DEEPBIND is
+used, the "SomeSym" definition will always be mapped to the definition
+from the corresponding dependent library. This can avoid symbol
+conflicts.
+
+There are some risks with using RTLD_DEEPBIND, in particular potential
+issues with modules written in C++. It is not recommended to enable
+$APR_DEEPBIND unless it solves a specific problem and after thorough
+testing of the configuration.

View File

@ -6,7 +6,7 @@
Summary: Apache Portable Runtime library
Name: apr
Version: 1.6.3
Release: 10%{?dist}
Release: 12%{?dist}
# ASL 2.0: everything
# ISC: network_io/apr-1.4.6/network_io/unix/inet_?to?.c
# BSD with advertising: strings/apr_snprintf.c, strings/apr_fnmatch.c,
@ -122,7 +122,7 @@ popd
%files
%defattr(-,root,root,-)
%doc CHANGES LICENSE NOTICE
%doc CHANGES LICENSE NOTICE README*
%{_libdir}/libapr-%{aprver}.so.*
%files devel
@ -141,6 +141,12 @@ popd
%{_datadir}/aclocal/*.m4
%changelog
* Wed Jun 23 2021 Joe Orton <jorton@redhat.com> - 1.6.3-12
- document $APR_DEEPBIND env var (#1886222)
* Thu Jun 11 2020 Joe Orton <jorton@redhat.com> - 1.6.3-11
- only enable RTLD_DEEPBIND if $APR_DEEPBIND is set in env (#1845912)
* Thu May 28 2020 Joe Orton <jorton@redhat.com> - 1.6.3-10
- use RTLD_DEEPBIND in apr_dso_open() (#1819607)