Race condition fixes:
authorFrantišek Dvořák <valtri@civ.zcu.cz>
Mon, 19 Mar 2012 13:56:05 +0000 (13:56 +0000)
committerFrantišek Dvořák <valtri@civ.zcu.cz>
Mon, 19 Mar 2012 13:56:05 +0000 (13:56 +0000)
- default flavour of gss library switched to threaded
- race conditions in initializations
- workaround occasional crash in gss_init_sec_context() when using multiple threads

org.glite.lbjp-common.gss/Makefile
org.glite.lbjp-common.gss/src/glite_gss.c

index 97f21a0..320c18e 100644 (file)
@@ -71,22 +71,22 @@ GLOBUS_GSSAPI_THR_LIBS=-lglobus_gssapi_gsi_${thrflavour}
 KERBEROS_GSSAPI_LIBS=-lgssapi_krb5 
 KERBEROS_GSSAPI_CFLAGS=-DNO_GLOBUS_GSSAPI
 
-GLOBUS_GSSAPI_GSI_LIBS?=${GLOBUS_NOTHR_LIBS} ${GLOBUS_GSSAPI_NOTHR_LIBS}
-GLOBUS_GSSAPI_GSI_CFLAGS?=${GLOBUS_NOTHR_INC}
+GLOBUS_GSSAPI_GSI_LIBS?=${GLOBUS_THR_LIBS} ${GLOBUS_GSSAPI_THR_LIBS}
+GLOBUS_GSSAPI_GSI_CFLAGS?=${GLOBUS_THR_INC}
 
-GLOBUS_COMMON_LIBS?=${GLOBUS_NOTHR_LIBS}
-GLOBUS_COMMON_CFLAGS?=${GLOBUS_NOTHR_INC}
+GLOBUS_COMMON_LIBS?=${GLOBUS_THR_LIBS}
+GLOBUS_COMMON_CFLAGS?=${GLOBUS_THR_INC}
 
 ifeq ($(gssapi_provider),kerberos)
-GSSAPI_NOTHR_LIBS=${GLOBUS_COMMON_LIBS} ${KERBEROS_GSSAPI_LIBS} -lssl
-GSSAPI_THR_LIBS=${GLOBUS_COMMON_CFLAGS} ${KERBEROS_GSSAPI_LIBS} -lssl
-GSSAPI_THR_INC=${GLOBUS_THR_INC} ${KERBEROS_GSSAPI_CFLAGS}
-GSSAPI_NOTHR_INC=${GLOBUS_COMMON_CFLAGS} ${KERBEROS_GSSAPI_CFLAGS}
+GSSAPI_THR_LIBS=${GLOBUS_COMMON_LIBS} ${KERBEROS_GSSAPI_LIBS} -lssl
+GSSAPI_THR_INC=${GLOBUS_COMMON_CFLAGS} ${KERBEROS_GSSAPI_CFLAGS}
+GSSAPI_NOTHR_LIBS=${GLOBUS_NOTHR_LIBS} ${KERBEROS_GSSAPI_LIBS} -lssl
+GSSAPI_NOTHR_INC=${GLOBUS_NOTHR_INC} ${KERBEROS_GSSAPI_CFLAGS}
 else
-GSSAPI_NOTHR_LIBS=${GLOBUS_GSSAPI_GSI_LIBS}
-GSSAPI_THR_LIBS=${GLOBUS_THR_LIBS} ${GLOBUS_GSSAPI_THR_LIBS}
-GSSAPI_THR_INC=${GLOBUS_THR_INC}
-GSSAPI_NOTHR_INC=${GLOBUS_GSSAPI_GSI_CFLAGS}
+GSSAPI_THR_LIBS=${GLOBUS_GSSAPI_GSI_LIBS}
+GSSAPI_THR_INC=${GLOBUS_GSSAPI_GSI_CFLAGS}
+GSSAPI_NOTHR_LIBS=${GLOBUS_NOTHR_LIBS} ${GLOBUS_GSSAPI_NOTHR_LIBS}
+GSSAPI_NOTHR_INC=${GLOBUS_NOTHR_INC}
 endif
 
 LIBCARES_CFLAGS?=-I${cares_prefix}/include
@@ -118,12 +118,12 @@ endif
 
 
 ifeq ($(thrflavour),)
-${GSS_STATICLIB}: ${GSS_OBJS}
-       ar crv $@ ${GSS_OBJS}
+${GSS_STATICLIB}: ${GSS_THROBJS}
+       ar crv $@ ${GSS_THROBJS}
        ranlib $@
 
-${GSS_LTLIB}: ${GSS_OBJS}
-       ${LINK} ${version_info} -o $@ ${GSS_LOBJS} ${GSSAPI_NOTHR_LIBS} ${LIBCARES_LIBS}
+${GSS_LTLIB}: ${GSS_THROBJS}
+       ${LINK} ${version_info} -o $@ ${GSS_THRLOBJS} ${GSSAPI_THR_LIBS} ${LIBCARES_LIBS} -lpthread
 else
 ${GSS_NOTHRSTATICLIB}: ${GSS_OBJS}
        ar crv $@ ${GSS_OBJS}
@@ -137,7 +137,7 @@ ${GSS_NOTHRLTLIB}: ${GSS_OBJS}
        ${LINK} ${version_info} -o $@ ${GSS_LOBJS} ${GSSAPI_NOTHR_LIBS} ${LIBCARES_LIBS}
 
 ${GSS_THRLTLIB}: ${GSS_THROBJS}
-       ${LINK} ${version_info} -o $@ ${GSS_THRLOBJS} ${GSSAPI_THR_LIBS} ${LIBCARES_LIBS}
+       ${LINK} ${version_info} -o $@ ${GSS_THRLOBJS} ${GSSAPI_THR_LIBS} ${LIBCARES_LIBS} -lpthread
 endif
 
 
@@ -191,7 +191,7 @@ distclean:
        ${COMPILE} ${GSSAPI_NOTHR_INC} ${LIBCARES_CFLAGS} -o $@ -c $<
 
 %.thr.o: %.c
-       ${COMPILE} ${GSSAPI_THR_INC} ${LIBCARES_CFLAGS} -o $@ -c $<
+       ${COMPILE} -D_REENTRANT -DGLITE_LBU_THREADED ${GSSAPI_THR_INC} ${LIBCARES_CFLAGS} -o $@ -c $<
 
 test_gss.o: %.o: %.cpp
        ${CXX} -c ${CFLAGS} ${GLOBUS_GSSAPI_GSI_CFLAGS} ${CPPUNIT_CFLAGS} -Wno-error $<
index 282b321..ac7e1a2 100644 (file)
@@ -33,6 +33,9 @@ limitations under the License.
 #include <ares.h>
 #include <ares_version.h>
 #include <errno.h>
+#ifdef GLITE_LBU_THREADED
+#include <pthread.h>
+#endif
 
 #include <globus_common.h>
 
@@ -65,6 +68,9 @@ struct asyn_result {
 };
 
 static int globus_common_activated = 0;
+#ifdef GLITE_LBU_THREADED
+static pthread_mutex_t init_lock = PTHREAD_MUTEX_INITIALIZER;
+#endif
 
 typedef struct gssapi_mech {
     const char* name;
@@ -1059,6 +1065,10 @@ static int try_conn_and_auth (edg_wll_GssCred cred, gss_name_t target, gss_OID m
    do { /* XXX: the black magic above */
 
    while (!context_established) {
+#ifdef GLITE_LBU_THREADED
+      /* XXX: gss_init_sec_context() not thread-safe? */
+      pthread_mutex_lock(&init_lock);
+#endif
       /* XXX verify ret_flags match what was requested */
       maj_stat = gss_init_sec_context(&min_stat, gss_cred, &context,
                                      target, mech,
@@ -1066,6 +1076,9 @@ static int try_conn_and_auth (edg_wll_GssCred cred, gss_name_t target, gss_OID m
                                      0, GSS_C_NO_CHANNEL_BINDINGS,
                                      &input_token, NULL, &output_token,
                                      NULL, NULL);
+#ifdef GLITE_LBU_THREADED
+      pthread_mutex_unlock(&init_lock);
+#endif
       if (input_token.length > 0) {
         free(input_token.value);
         input_token.length = 0;
@@ -1533,6 +1546,9 @@ edg_wll_gss_initialize(void)
 {
    int ret = 0;
 
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_lock(&init_lock);
+#endif
    if (!getenv("GLOBUS_THREAD_MODEL")) {
      putenv("GLOBUS_THREAD_MODEL=pthread");
    }
@@ -1546,6 +1562,9 @@ edg_wll_gss_initialize(void)
 
    if (globus_module_activate(GLOBUS_COMMON_MODULE) == GLOBUS_SUCCESS)
        globus_common_activated = 1;
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_unlock(&init_lock);
+#endif
 
    return ret;
 }
@@ -1558,6 +1577,9 @@ edg_wll_gss_initialize(void)
 void
 edg_wll_gss_finalize(void)
 {
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_lock(&init_lock);
+#endif
 #ifndef NO_GLOBUS_GSSAPI
    globus_module_deactivate(GLOBUS_GSI_GSSAPI_MODULE);
 #endif
@@ -1565,6 +1587,9 @@ edg_wll_gss_finalize(void)
       globus_module_deactivate(GLOBUS_COMMON_MODULE);
       globus_common_activated = 0;
    }
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_unlock(&init_lock);
+#endif
 }
 
 
@@ -1868,10 +1893,16 @@ edg_wll_gss_gethostname(char *name, int len)
 {
    int ret;
 
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_lock(&init_lock);
+#endif
    if (globus_common_activated)
       ret = globus_libc_gethostname(name, len);
    else
       ret = gethostname(name, len);
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_unlock(&init_lock);
+#endif
 
    return ret;
 }
@@ -1969,6 +2000,9 @@ edg_wll_gss_set_signal_handler(int signum,
    int ret;
    intptr_t signum2; 
 
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_lock(&init_lock);
+#endif
    if (!globus_common_activated) {
           struct sigaction     sa,osa;
           
@@ -1976,15 +2010,17 @@ edg_wll_gss_set_signal_handler(int signum,
           sigemptyset(&sa.sa_mask);
           sa.sa_handler = handler_func;
           ret = sigaction(signum, &sa, &osa);
-          return ret;
-   }
-
-   signum2 = signum;
-   ret = globus_callback_space_register_signal_handler(signum,
+   } else {
+          signum2 = signum;
+          ret = globus_callback_space_register_signal_handler(signum,
                                                       GLOBUS_TRUE,
                                                       (globus_callback_func_t)handler_func,
                                                       (void *)signum2,
                                                       GLOBUS_CALLBACK_GLOBAL_SPACE);
+   }
+#ifdef GLITE_LBU_THREADED
+   pthread_mutex_unlock(&init_lock);
+#endif
 
    return ret;
 }