components/openldap/patches/08-mutex-init.patch
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--
Close of build 117.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 )