Bug#265751: cyrus-sasl2: Candidate NMU patch for 2.1.19-1.1 - SARGE (4/
From
Henrique de Moraes Holschuh@1:229/2 to
All on Sat Aug 14 21:20:06 2004
[continued from previous message]
+ params->utils->free(name_without_realm.value);
+
+- if (name_token.value)
++ if (name_token.value) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, &name_token);
+- if (without)
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
++ if (without) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_name(&min_stat, &without);
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
+ SETERROR(text->utils, "GSSAPI Failure");
+ sasl_gss_free_context_contents(text);
+ return SASL_BADAUTH;
+@@ -755,6 +842,7 @@
+
+ name_without_realm.length = strlen( (char *) name_without_realm.value );
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_import_name (&min_stat,
+ &name_without_realm,
+ /* Solaris 8/9 gss_import_name doesn't accept GSS_C_NULL_OID here, +@@ -765,35 +853,53 @@
+ GSS_C_NULL_OID,
+ #endif
+ &without);
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ if (GSS_ERROR(maj_stat)) {
+ params->utils->free(name_without_realm.value);
+- if (name_token.value)
++ if (name_token.value) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, &name_token);
+- if (without)
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
++ if (without) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_name(&min_stat, &without);
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
+ SETERROR(text->utils, "GSSAPI Failure");
+ sasl_gss_free_context_contents(text);
+ return SASL_BADAUTH;
+ }
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_compare_name(&min_stat,
+ text->client_name,
+ without,
+ &equal);
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ if (GSS_ERROR(maj_stat)) {
+ params->utils->free(name_without_realm.value);
+- if (name_token.value)
++ if (name_token.value) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, &name_token);
+- if (without)
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
++ if (without) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_name(&min_stat, &without);
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
+ SETERROR(text->utils, "GSSAPI Failure");
+ sasl_gss_free_context_contents(text);
+ return SASL_BADAUTH;
+ }
+
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_name(&min_stat,&without);
++ GSS_UNLOCK_MUTEX(params->utils);
++
+ } else {
+ equal = 0;
+ }
+@@ -814,11 +920,14 @@
+ }
+ }
+
+- if (name_token.value)
++ if (name_token.value) {
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, &name_token);
+- if (name_without_realm.value)
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
++ if (name_without_realm.value) {
+ params->utils->free(name_without_realm.value);
+-
++ }
+
+ /* we have to decide what sort of encryption/integrity/etc.,
+ we support */
+@@ -865,6 +974,7 @@
+ real_input_token.value = (void *)sasldata;
+ real_input_token.length = 4;
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_wrap(&min_stat,
+ text->gss_ctx,
+ 0, /* Just integrity checking here */
+@@ -872,11 +982,15 @@
+ input_token,
+ NULL,
+ output_token);
++ GSS_UNLOCK_MUTEX(params->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(params->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(params->utils);
++ }
+ sasl_gss_free_context_contents(text);
+ return SASL_FAIL;
+ }
+@@ -889,14 +1003,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);
+ }
+
+ /* Wait for ssf request and authid */
+@@ -911,12 +1029,14 @@
+ real_input_token.value = (void *)clientin;
+ real_input_token.length = clientinlen;
+
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_unwrap(&min_stat,
+ text->gss_ctx,
+ input_token,
+ output_token,
+ NULL,
+ NULL);
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ if (GSS_ERROR(maj_stat)) {
+ sasl_gss_seterror(text->utils, maj_stat, min_stat);
+@@ -946,8 +1066,11 @@
+ "protocol violation: client requested invalid layer");
+ /* Mark that we attempted negotiation */
+ oparams->mech_ssf = 2;
+- if (output_token->value)
++ 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_FAIL;
+ }
+@@ -990,7 +1113,9 @@
+ } else {
+ SETERROR(text->utils,
+ "token too short");
++ 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_FAIL;
+ }
+@@ -1026,7 +1151,9 @@
+ }
+ }
+
++ GSS_LOCK_MUTEX(params->utils);
+ gss_release_buffer(&min_stat, output_token);
++ GSS_UNLOCK_MUTEX(params->utils);
+
+ text->state = SASL_GSSAPI_STATE_AUTHENTICATED;
+
+@@ -1065,7 +1192,7 @@
+ &gssapi_server_mech_new, /* mech_new */
+ &gssapi_server_mech_step, /* mech_step */
+ &gssapi_common_mech_dispose, /* mech_dispose */
+- NULL, /* mech_free */
++ &gssapi_common_mech_free, /* mech_free */
+ NULL, /* setpass */
+ NULL, /* user_query */
+ NULL, /* idle */
+@@ -1125,6 +1252,15 @@
+ *out_version = SASL_SERVER_PLUG_VERSION;
+ *pluglist = gssapi_server_plugins;
+ *plugcount = 1;
++
++#ifdef GSS_USE_MUTEXES
++ if (!gss_mutex) {
++ gss_mutex = utils->mutex_alloc();
++ if (!gss_mutex) {
++ return SASL_FAIL;
++ }
++ }
++#endif
+
+ return SASL_OK;
+ }
+@@ -1138,7 +1274,7 @@
+ context_t *text;
+
+ /* holds state are in */
+- text = gss_new_context(params->utils);
++ text = sasl_gss_new_context(params->utils);
+ if (text == NULL) {
+ MEMERROR(params->utils);
+ return SASL_NOMEM;
+@@ -1234,10 +1370,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;
+@@ -1261,7 +1399,9 @@
+ * and no input from the server. However, thanks to Imap,
+ * which discards our first output, this happens all the time.
+ * Throw away the context and try again. */
++ GSS_LOCK_MUTEX(params->utils);
+ maj_stat = gss_delete_sec_context (&min_stat,&text->gss_ctx,GSS_C_NO_BUFFER);
++ GSS_UNLOCK_MUTEX(params->utils);
+ text->gss_ctx = GSS_C_NO_CONTEXT;
+ }
+
+@@ -1282,6 +1422,7 @@
[continued in next message]
--- SoupGate-Win32 v1.05
* Origin: you cannot sedate... all the things you hate (1:229/2)