dovecot-2.0: GSSAPI: Fixed memory leak on error conditions.

dovecot at dovecot.org dovecot at dovecot.org
Sat Jul 18 01:58:06 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/8c370896b657
changeset: 9641:8c370896b657
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jul 17 18:57:48 2009 -0400
description:
GSSAPI: Fixed memory leak on error conditions.

diffstat:

1 file changed, 18 insertions(+), 13 deletions(-)
src/auth/mech-gssapi.c |   31 ++++++++++++++++++-------------

diffs (67 lines):

diff -r ac52d79b7b94 -r 8c370896b657 src/auth/mech-gssapi.c
--- a/src/auth/mech-gssapi.c	Fri Jul 17 17:13:51 2009 -0400
+++ b/src/auth/mech-gssapi.c	Fri Jul 17 18:57:48 2009 -0400
@@ -235,9 +235,10 @@ mech_gssapi_sec_context(struct gssapi_au
 {
 	struct auth_request *auth_request = &request->auth_request;
 	OM_uint32 major_status, minor_status;
-	gss_buffer_desc outbuf;
+	gss_buffer_desc output_token;
 	gss_OID name_type;
 	const char *username, *error;
+	int ret = 0;
 
 	major_status = gss_accept_sec_context (
 		&minor_status,
@@ -247,7 +248,7 @@ mech_gssapi_sec_context(struct gssapi_au
 		GSS_C_NO_CHANNEL_BINDINGS,
 		&request->authn_name, 
 		NULL, /* mech_type */
-		&outbuf,
+		&output_token,
 		NULL, /* ret_flags */
 		NULL, /* time_rec */
 		NULL  /* delegated_cred_handle */
@@ -267,16 +268,17 @@ mech_gssapi_sec_context(struct gssapi_au
 	case GSS_S_COMPLETE:
 		if (!get_display_name(auth_request, request->authn_name,
 				      &name_type, &username) < 0)
-			return -1;
-		if (!auth_request_set_username(auth_request, username,
-					       &error)) {
+			ret = -1;
+		else if (!auth_request_set_username(auth_request, username,
+						    &error)) {
 			auth_request_log_info(auth_request, "gssapi",
 					      "authn_name: %s", error);
-			return -1;
+			ret = -1;
+		} else {
+			request->sasl_gssapi_state = GSS_STATE_WRAP;
+			auth_request_log_debug(auth_request, "gssapi",
+				"security context state completed.");
 		}
-		request->sasl_gssapi_state = GSS_STATE_WRAP;
-		auth_request_log_debug(auth_request, "gssapi",
-				       "security context state completed.");
 		break;
 	case GSS_S_CONTINUE_NEEDED:
 		auth_request_log_debug(auth_request, "gssapi",
@@ -289,10 +291,13 @@ mech_gssapi_sec_context(struct gssapi_au
 		break;
 	}
 
-	auth_request->callback(auth_request, AUTH_CLIENT_RESULT_CONTINUE,
-			       outbuf.value, outbuf.length);
-	(void)gss_release_buffer(&minor_status, &outbuf);
-	return 0;
+	if (ret == 0) {
+		auth_request->callback(auth_request,
+				       AUTH_CLIENT_RESULT_CONTINUE,
+				       output_token.value, output_token.length);
+	}
+	(void)gss_release_buffer(&minor_status, &output_token);
+	return ret;
 }
 
 static int


More information about the dovecot-cvs mailing list