• 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)