From 7c8b4cff010d7df01640f8c265b3e6d0dcc90757 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Franti=C5=A1ek=20Dvo=C5=99=C3=A1k?= Date: Tue, 7 Dec 2010 12:14:55 +0000 Subject: [PATCH] Activate globus modules only once (deactivation is not thread safe). Add a cleanup function. --- org.glite.security.gss/interface/glite_gss.h | 3 +++ org.glite.security.gss/src/glite_gss.c | 32 ++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/org.glite.security.gss/interface/glite_gss.h b/org.glite.security.gss/interface/glite_gss.h index 9468689..37f719f 100644 --- a/org.glite.security.gss/interface/glite_gss.h +++ b/org.glite.security.gss/interface/glite_gss.h @@ -78,6 +78,9 @@ typedef struct _edg_wll_GssCred_data *edg_wll_GssCred; int edg_wll_gss_initialize(void); +void +edg_wll_gss_finalize(void); + int edg_wll_gss_acquire_cred_gsi(const char *cert_file, const char *key_file, diff --git a/org.glite.security.gss/src/glite_gss.c b/org.glite.security.gss/src/glite_gss.c index 08a4349..bae85f8 100644 --- a/org.glite.security.gss/src/glite_gss.c +++ b/org.glite.security.gss/src/glite_gss.c @@ -59,6 +59,8 @@ struct asyn_result { int err; }; +static int globus_common_activated = 0; + static int decrement_timeout(struct timeval *timeout, struct timeval before, struct timeval after) { (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec); @@ -1165,16 +1167,31 @@ edg_wll_gss_reject(int sock) int edg_wll_gss_initialize(void) { - int ret; + int ret = 0; - ret = globus_module_activate(GLOBUS_GSI_GSSAPI_MODULE); - if (ret != GLOBUS_SUCCESS) { + if (globus_module_activate(GLOBUS_GSI_GSSAPI_MODULE) != GLOBUS_SUCCESS) { errno = EINVAL; ret = EDG_WLL_GSS_ERROR_ERRNO; } + + if (globus_module_activate(GLOBUS_COMMON_MODULE) == GLOBUS_SUCCESS) + globus_common_activated = 1; + return ret; } + +void +edg_wll_gss_finalize(void) +{ + globus_module_deactivate(GLOBUS_GSI_GSSAPI_MODULE); + if (globus_common_activated) { + globus_module_deactivate(GLOBUS_COMMON_MODULE); + globus_common_activated = 0; + } +} + + int edg_wll_gss_release_cred(edg_wll_GssCred *cred, edg_wll_GssStatus* gss_code) { @@ -1457,13 +1474,10 @@ edg_wll_gss_gethostname(char *name, int len) { int ret; - ret = globus_module_activate(GLOBUS_COMMON_MODULE); - if (ret != GLOBUS_SUCCESS) { + if (globus_common_activated) + ret = globus_libc_gethostname(name, len); + else ret = gethostname(name, len); - return ret; - } - ret = globus_libc_gethostname(name, len); - globus_module_deactivate(GLOBUS_COMMON_MODULE); return ret; } -- 1.8.2.3