From 97bf4380344e8ba5b724793494f660c65b8de84f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Franti=C5=A1ek=20Dvo=C5=99=C3=A1k?= Date: Mon, 19 Mar 2012 13:56:05 +0000 Subject: [PATCH] Race condition fixes: - 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 | 36 ++++++++++++------------ org.glite.lbjp-common.gss/src/glite_gss.c | 46 +++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/org.glite.lbjp-common.gss/Makefile b/org.glite.lbjp-common.gss/Makefile index 97f21a0..320c18e 100644 --- a/org.glite.lbjp-common.gss/Makefile +++ b/org.glite.lbjp-common.gss/Makefile @@ -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 $< diff --git a/org.glite.lbjp-common.gss/src/glite_gss.c b/org.glite.lbjp-common.gss/src/glite_gss.c index 282b321..ac7e1a2 100644 --- a/org.glite.lbjp-common.gss/src/glite_gss.c +++ b/org.glite.lbjp-common.gss/src/glite_gss.c @@ -33,6 +33,9 @@ limitations under the License. #include #include #include +#ifdef GLITE_LBU_THREADED +#include +#endif #include @@ -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; } -- 1.8.2.3