author | Mike Sullivan <Mike.Sullivan@Oracle.COM> |
Thu, 26 Jan 2017 16:44:14 -0800 | |
changeset 7617 | 14b1a4293086 |
parent 6377 | 12498e4ad8f9 |
permissions | -rw-r--r-- |
6377
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
1 |
Fixes a race condition that can be triggered when multiple threads |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
2 |
enter the function ldap_int_utils_init about the same time. |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
3 |
Patch was developed in-house; it is Solaris specific and |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
4 |
will not be contributed upstream. |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
5 |
|
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
6 |
--- openldap-2.4.44/libraries/libldap/util-int.c.old 2016-06-28 12:13:02.410770969 -0700 |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
7 |
+++ openldap-2.4.44/libraries/libldap/util-int.c 2016-06-28 12:13:07.923164035 -0700 |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
8 |
@@ -92,6 +92,10 @@ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
9 |
/* Don't know how to handle this version, pretend it's not there */ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
10 |
# undef HAVE_GETHOSTBYADDR_R |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
11 |
# endif |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
12 |
+ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
13 |
+/* use static mutex to protect mutex initialization */ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
14 |
+static ldap_pvt_thread_mutex_t ldap_int_utils_init_mutex = PTHREAD_MUTEX_INITIALIZER; |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
15 |
+ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
16 |
#endif /* LDAP_R_COMPILE */ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
17 |
|
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
18 |
char *ldap_pvt_ctime( const time_t *tp, char *buf ) |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
19 |
@@ -700,9 +704,17 @@ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
20 |
static int done=0; |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
21 |
if (done) |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
22 |
return; |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
23 |
+#ifndef LDAP_R_COMPILE |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
24 |
done=1; |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
25 |
+#endif |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
26 |
|
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
27 |
#ifdef LDAP_R_COMPILE |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
28 |
+ /* use static mutex to protect mutex initialization */ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
29 |
+ (void) LDAP_MUTEX_LOCK(&ldap_int_utils_init_mutex); |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
30 |
+ if (done) { |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
31 |
+ (void) LDAP_MUTEX_UNLOCK(&ldap_int_utils_init_mutex); |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
32 |
+ return; |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
33 |
+ } |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
34 |
#if !defined( USE_CTIME_R ) && !defined( HAVE_REENTRANT_FUNCTIONS ) |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
35 |
ldap_pvt_thread_mutex_init( &ldap_int_ctime_mutex ); |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
36 |
#endif |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
37 |
@@ -718,9 +727,13 @@ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
38 |
#ifdef HAVE_GSSAPI |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
39 |
ldap_pvt_thread_mutex_init( &ldap_int_gssapi_mutex ); |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
40 |
#endif |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
41 |
+ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
42 |
+ done=1; |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
43 |
+ /* use static mutex to protect mutex initialization */ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
44 |
+ (void) LDAP_MUTEX_UNLOCK(&ldap_int_utils_init_mutex); |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
45 |
#endif |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
46 |
|
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
47 |
/* call other module init functions here... */ |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
48 |
} |
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
49 |
|
12498e4ad8f9
23642655 libldap_r-2.4.so.2: hang caused by a race condition in ldap_int_initialize()
zihao.zhu@oracle.com <zihao.zhu@oracle.com>
parents:
diff
changeset
|
50 |
#if defined( NEED_COPY_HOSTENT ) |