[c5c522c] | 1 | Description: Handle removal of __libc_lock_lock and similar symbols from libc |
---|
| 2 | Bug: http://bugzilla.padl.com/show_bug.cgi?id=445 |
---|
| 3 | Bug-Debian: http://bugs.debian.org/727177 |
---|
| 4 | Bug-Arch-Linux-ARM: https://github.com/archlinuxarm/PKGBUILDs/issues/296 |
---|
| 5 | Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=438692 |
---|
| 6 | Author: Dennis Schridde <devurandom@gmx.net> |
---|
| 7 | |
---|
| 8 | --- a/ldap-nss.c |
---|
| 9 | +++ b/ldap-nss.c |
---|
| 10 | @@ -142,7 +142,7 @@ static void (*__sigpipe_handler) (int) = |
---|
| 11 | */ |
---|
| 12 | static ldap_session_t __session = { NULL, NULL, 0, LS_UNINITIALIZED }; |
---|
| 13 | |
---|
| 14 | -#if defined(HAVE_PTHREAD_ATFORK) || defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 15 | +#if defined(HAVE_PTHREAD_ATFORK) || defined(HAVE___LIBC_ONCE) |
---|
| 16 | static pthread_once_t __once = PTHREAD_ONCE_INIT; |
---|
| 17 | #endif |
---|
| 18 | |
---|
| 19 | @@ -150,7 +150,7 @@ static pthread_once_t __once = PTHREAD_O |
---|
| 20 | static FILE *__debugfile; |
---|
| 21 | #endif /* LBER_OPT_LOG_PRINT_FILE */ |
---|
| 22 | |
---|
| 23 | -#ifndef HAVE_PTHREAD_ATFORK |
---|
| 24 | +#if !defined(HAVE_PTHREAD_ATFORK) || !defined(HAVE___LIBC_ONCE) |
---|
| 25 | /* |
---|
| 26 | * Process ID that opened the session. |
---|
| 27 | */ |
---|
| 28 | @@ -162,7 +162,7 @@ static uid_t __euid = -1; |
---|
| 29 | static int __ssl_initialized = 0; |
---|
| 30 | #endif /* HAVE_LDAPSSL_CLIENT_INIT */ |
---|
| 31 | |
---|
| 32 | -#if defined(HAVE_PTHREAD_ATFORK) || defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 33 | +#if defined(HAVE_PTHREAD_ATFORK) || defined(HAVE___LIBC_ONCE) |
---|
| 34 | /* |
---|
| 35 | * Prepare for fork(); lock mutex. |
---|
| 36 | */ |
---|
| 37 | @@ -514,7 +514,7 @@ _nss_ldap_default_constr (nss_ldap_backe |
---|
| 38 | } |
---|
| 39 | #endif /* HAVE_NSSWITCH_H */ |
---|
| 40 | |
---|
| 41 | -#if defined(HAVE_PTHREAD_ATFORK) || defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 42 | +#if defined(HAVE_PTHREAD_ATFORK) || defined(HAVE___LIBC_ONCE) |
---|
| 43 | static void |
---|
| 44 | do_atfork_prepare (void) |
---|
| 45 | { |
---|
| 46 | @@ -548,7 +548,7 @@ do_atfork_setup (void) |
---|
| 47 | #ifdef HAVE_PTHREAD_ATFORK |
---|
| 48 | (void) pthread_atfork (do_atfork_prepare, do_atfork_parent, |
---|
| 49 | do_atfork_child); |
---|
| 50 | -#elif defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 51 | +#elif defined(HAVE___LIBC_ATFORK) |
---|
| 52 | (void) __libc_atfork (do_atfork_prepare, do_atfork_parent, do_atfork_child); |
---|
| 53 | #endif |
---|
| 54 | |
---|
| 55 | @@ -1111,7 +1111,7 @@ static NSS_STATUS |
---|
| 56 | do_init (void) |
---|
| 57 | { |
---|
| 58 | ldap_config_t *cfg; |
---|
| 59 | -#ifndef HAVE_PTHREAD_ATFORK |
---|
| 60 | +#if !defined(HAVE_PTHREAD_ATFORK) || !defined(HAVE___LIBC_ONCE) |
---|
| 61 | pid_t pid; |
---|
| 62 | #endif |
---|
| 63 | uid_t euid; |
---|
| 64 | @@ -1128,7 +1128,7 @@ do_init (void) |
---|
| 65 | } |
---|
| 66 | |
---|
| 67 | #ifndef HAVE_PTHREAD_ATFORK |
---|
| 68 | -#if defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 69 | +#if defined(HAVE___LIBC_ONCE) |
---|
| 70 | /* |
---|
| 71 | * This bogosity is necessary because Linux uses different |
---|
| 72 | * PIDs for different threads (like IRIX, which we don't |
---|
| 73 | @@ -1160,7 +1160,7 @@ do_init (void) |
---|
| 74 | pid = -1; /* linked against libpthreads, don't care */ |
---|
| 75 | #else |
---|
| 76 | pid = getpid (); |
---|
| 77 | -#endif /* HAVE_LIBC_LOCK_H || HAVE_BITS_LIBC_LOCK_H */ |
---|
| 78 | +#endif /* HAVE___LIBC_ONCE */ |
---|
| 79 | #endif /* HAVE_PTHREAD_ATFORK */ |
---|
| 80 | |
---|
| 81 | euid = geteuid (); |
---|
| 82 | @@ -1170,7 +1170,7 @@ do_init (void) |
---|
| 83 | syslog (LOG_AUTHPRIV | LOG_DEBUG, |
---|
| 84 | "nss_ldap: __session.ls_state=%d, __session.ls_conn=%p, __euid=%i, euid=%i", |
---|
| 85 | __session.ls_state, __session.ls_conn, __euid, euid); |
---|
| 86 | -#elif defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 87 | +#elif defined(HAVE___LIBC_ONCE) |
---|
| 88 | syslog (LOG_AUTHPRIV | LOG_DEBUG, |
---|
| 89 | "nss_ldap: libpthreads=%s, __session.ls_state=%d, __session.ls_conn=%p, __pid=%i, pid=%i, __euid=%i, euid=%i", |
---|
| 90 | ((__pthread_once == NULL || __pthread_atfork == NULL) ? "FALSE" : "TRUE"), |
---|
| 91 | @@ -1194,11 +1194,11 @@ do_init (void) |
---|
| 92 | } |
---|
| 93 | else |
---|
| 94 | #ifndef HAVE_PTHREAD_ATFORK |
---|
| 95 | -#if defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 96 | +#if defined(HAVE___LIBC_ONCE) |
---|
| 97 | if ((__pthread_once == NULL || __pthread_atfork == NULL) && __pid != pid) |
---|
| 98 | #else |
---|
| 99 | if (__pid != pid) |
---|
| 100 | -#endif /* HAVE_LIBC_LOCK_H || HAVE_BITS_LIBC_LOCK_H */ |
---|
| 101 | +#endif /* HAVE___LIBC_ONCE */ |
---|
| 102 | { |
---|
| 103 | do_close_no_unbind (); |
---|
| 104 | } |
---|
| 105 | @@ -1259,9 +1259,9 @@ do_init (void) |
---|
| 106 | debug ("<== do_init (pthread_once failed)"); |
---|
| 107 | return NSS_UNAVAIL; |
---|
| 108 | } |
---|
| 109 | -#elif defined(HAVE_PTHREAD_ATFORK) && ( defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) ) |
---|
| 110 | +#elif defined(HAVE_PTHREAD_ATFORK) && defined(HAVE___LIBC_ONCE) |
---|
| 111 | __libc_once (__once, do_atfork_setup); |
---|
| 112 | -#elif defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 113 | +#elif defined(HAVE___LIBC_ONCE) |
---|
| 114 | /* |
---|
| 115 | * Only install the pthread_atfork() handlers i |
---|
| 116 | * we are linked against libpthreads. Otherwise, |
---|
| 117 | --- a/ldap-nss.h |
---|
| 118 | +++ b/ldap-nss.h |
---|
| 119 | @@ -670,7 +670,7 @@ extern int __multi_threaded; |
---|
| 120 | #define NSS_LDAP_LOCK(m) mutex_lock(&m) |
---|
| 121 | #define NSS_LDAP_UNLOCK(m) mutex_unlock(&m) |
---|
| 122 | #define NSS_LDAP_DEFINE_LOCK(m) static mutex_t m = DEFAULTMUTEX |
---|
| 123 | -#elif defined(HAVE_LIBC_LOCK_H) || defined(HAVE_BITS_LIBC_LOCK_H) |
---|
| 124 | +#elif defined(HAVE___LIBC_LOCK_LOCK) && defined(HAVE___LIBC_LOCK_UNLOCK) |
---|
| 125 | #define NSS_LDAP_LOCK(m) __libc_lock_lock(m) |
---|
| 126 | #define NSS_LDAP_UNLOCK(m) __libc_lock_unlock(m) |
---|
| 127 | #define NSS_LDAP_DEFINE_LOCK(m) static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER |
---|
| 128 | --- a/configure.in |
---|
| 129 | +++ b/configure.in |
---|
| 130 | @@ -234,6 +234,7 @@ AC_CHECK_FUNCS(pthread_atfork) |
---|
| 131 | AC_CHECK_FUNCS(pthread_once) |
---|
| 132 | AC_CHECK_FUNCS(ether_aton) |
---|
| 133 | AC_CHECK_FUNCS(ether_ntoa) |
---|
| 134 | +AC_CHECK_FUNCS(__libc_once __libc_atfork __libc_lock_lock __libc_lock_unlock) |
---|
| 135 | |
---|
| 136 | AC_MSG_CHECKING(for struct ether_addr) |
---|
| 137 | AC_TRY_COMPILE([#include <sys/types.h> |
---|