Bug#265751: cyrus-sasl2: Candidate NMU patch for 2.1.19-1.1 - SARGE (3/
From
Henrique de Moraes Holschuh@1:229/2 to
All on Sat Aug 14 21:20:06 2004
[continued from previous message]
+ utils->seterror(utils->conn, 0, out);
+ }
+ utils->free(out);
++
++ return SASL_OK;
+ }
+
+ static int
+@@ -314,6 +341,7 @@
+ output_token->value = NULL;
+ output_token->length = 0;
+
++ GSS_LOCK_MUTEX(text->utils);
+ maj_stat = gss_wrap (&min_stat,
+ text->gss_ctx,
+ privacy,
+@@ -321,12 +349,16 @@
+ input_token,
+ NULL,
+ output_token);
++ GSS_UNLOCK_MUTEX(text->utils);
+
+ if (GSS_ERROR(maj_stat))
+ {
+ sasl_gss_seterror(text->utils, maj_stat, min_stat);
+- if (output_token->value)
++ if (output_token->value) {
++ GSS_LOCK_MUTEX(text->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(text->utils);
++ }
+ return SASL_FAIL;
+ }
+
+@@ -337,7 +369,9 @@
+ &(text->encode_buf_len), output_token->length + 4);
+
+ if (ret != SASL_OK) {
++ GSS_LOCK_MUTEX(text->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(text->utils);
+ return ret;
+ }
+
+@@ -352,9 +386,11 @@
+
+ *output = text->encode_buf;
+
+- if (output_token->value)
++ if (output_token->value) {
++ GSS_LOCK_MUTEX(text->utils);
+ gss_release_buffer(&min_stat, output_token);
+-
++ GSS_UNLOCK_MUTEX(text->utils);
++ }
+ return SASL_OK;
+ }
+
+@@ -395,18 +431,23 @@
+ output_token->value = NULL;
+ output_token->length = 0;
+
++ GSS_LOCK_MUTEX(text->utils);
+ maj_stat = gss_unwrap (&min_stat,
+ text->gss_ctx,
+ input_token,
+ output_token,
+ NULL,
+ NULL);
++ GSS_UNLOCK_MUTEX(text->utils);
+
+ if (GSS_ERROR(maj_stat))
+ {
+ sasl_gss_seterror(text->utils,maj_stat,min_stat);
+- if (output_token->value)
++ if (output_token->value) {
++ GSS_LOCK_MUTEX(text->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(text->utils);
++ }
+ return SASL_FAIL;
+ }
+
+@@ -419,13 +460,17 @@
+ &text->decode_once_buf_len,
+ *outputlen);
+ if(result != SASL_OK) {
++ GSS_LOCK_MUTEX(text->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(text->utils);
+ return result;
+ }
+ *output = text->decode_once_buf;
+ memcpy(*output, output_token->value, *outputlen);
+ }
++ GSS_LOCK_MUTEX(text->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(text->utils);
+ }
+
+ return SASL_OK;
+@@ -447,7 +492,7 @@
+ return ret;
+ }
+
+-static context_t *gss_new_context(const sasl_utils_t *utils)
++static context_t *sasl_gss_new_context(const sasl_utils_t *utils)
+ {
+ context_t *ret;
+
+@@ -460,14 +505,17 @@
+ return ret;
+ }
+
+-static void sasl_gss_free_context_contents(context_t *text)
++static int sasl_gss_free_context_contents(context_t *text)
+ {
+ OM_uint32 maj_stat, min_stat;
+
+- if (!text) return;
++ if (!text) return SASL_OK;
+
++ GSS_LOCK_MUTEX(text->utils);
++
+ if (text->gss_ctx != GSS_C_NO_CONTEXT) {
+- maj_stat = gss_delete_sec_context (&min_stat,&text->gss_ctx,GSS_C_NO_BUFFER);
++ maj_stat = gss_delete_sec_context(&min_stat,&text->gss_ctx,
++ GSS_C_NO_BUFFER);
+ text->gss_ctx = GSS_C_NO_CONTEXT;
+ }
+
+@@ -490,6 +538,8 @@
+ maj_stat = gss_release_cred(&min_stat, &text->client_creds);
+ text->client_creds = GSS_C_NO_CREDENTIAL;
+ }
++
++ GSS_UNLOCK_MUTEX(text->utils);
+
+ if (text->out_buf) {
+ text->utils->free(text->out_buf);
+@@ -523,6 +573,9 @@
+ text->utils->free(text->authid);
+ text->authid = NULL;
+ }
++
++ return SASL_OK;
++
+ }
+
+ static void gssapi_common_mech_dispose(void *conn_context,
+@@ -532,6 +585,17 @@
+ utils->free(conn_context);
+ }
+
++static void gssapi_common_mech_free(void *global_context __attribute__((unused)),
++ const sasl_utils_t *utils)
++{
++#ifdef GSS_USE_MUTEXES
++ if (gss_mutex) {
++ utils->mutex_free(gss_mutex);
++ gss_mutex=NULL;
++ }
++#endif
++}
++
+ /***************************** Server Section *****************************/
+
+ static int
+@@ -543,7 +607,7 @@
+ {
+ context_t *text;
+
+- text = gss_new_context(params->utils);
++ text = sasl_gss_new_context(params->utils);
+ if (text == NULL) {
+ MEMERROR(params->utils);
+ return SASL_NOMEM;
+@@ -604,10 +668,12 @@
+ }
+ sprintf(name_token.value,"%s@%s", params->service, params->serverFQDN);
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_import_name (&min_stat,
+ &name_token,
+ GSS_C_NT_HOSTBASED_SERVICE,
+ &text->server_name);
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ params->utils->free(name_token.value);
+ name_token.value = NULL;
+@@ -619,10 +685,13 @@
+ }
+
+ if ( text->server_creds != GSS_C_NO_CREDENTIAL) {
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_release_cred(&min_stat, &text->server_creds);
++ GSS_UNLOCK_MUTEX(params->utils);
+ text->server_creds = GSS_C_NO_CREDENTIAL;
+ }
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_acquire_cred(&min_stat,
+ text->server_name,
+ GSS_C_INDEFINITE,
+@@ -631,6 +700,7 @@
+ &text->server_creds,
+ NULL,
+ NULL);
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ if (GSS_ERROR(maj_stat)) {
+ sasl_gss_seterror(text->utils, maj_stat, min_stat);
+@@ -645,6 +715,7 @@
+ }
+
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat =
+ gss_accept_sec_context(&min_stat,
+ &(text->gss_ctx),
+@@ -657,12 +728,15 @@
+ &out_flags,
+ NULL,
+ &(text->client_creds));
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ if (GSS_ERROR(maj_stat)) {
+ sasl_gss_log(text->utils, maj_stat, min_stat);
+ text->utils->seterror(text->utils->conn, SASL_NOLOG, "GSSAPI Failure: gss_accept_sec_context");
+ if (output_token->value) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(params->utils);
+ }
+ sasl_gss_free_context_contents(text);
+ return SASL_BADAUTH;
+@@ -673,7 +747,8 @@
+ (!(out_flags & GSS_C_DELEG_FLAG) ||
+ text->client_creds == GSS_C_NO_CREDENTIAL) )
+ {
+- text->utils->seterror(text->utils->conn, SASL_LOG_WARN, "GSSAPI warning: no credentials were passed");
++ text->utils->seterror(text->utils->conn, SASL_LOG_WARN,
++ "GSSAPI warning: no credentials were passed");
+ /* continue with authentication */
+ }
+
+@@ -684,14 +759,18 @@
+ ret = _plug_buf_alloc(text->utils, &(text->out_buf),
+ &(text->out_buf_len), *serveroutlen);
+ if(ret != SASL_OK) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(params->utils);
+ return ret;
+ }
+ memcpy(text->out_buf, output_token->value, *serveroutlen);
+ *serverout = text->out_buf;
+ }
+
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(params->utils);
+ } else {
+ /* No output token, send an empty string */
+ *serverout = GSSAPI_BLANK_STRING;
+@@ -717,19 +796,27 @@
+
+ /* We ignore whatever the client sent us at this stage */
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_display_name (&min_stat,
+ text->client_name,
+ &name_token,
+ NULL);
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ if (GSS_ERROR(maj_stat)) {
+ if (name_without_realm.value)
[continued in next message]
--- SoupGate-Win32 v1.05
* Origin: you cannot sedate... all the things you hate (1:229/2)