[SCM] Samba Shared Repository - branch master updated

Matthias Dieter Wallnöfer mdw at samba.org
Sat Dec 4 09:27:01 MST 2010


The branch, master has been updated
       via  536622e s4:dsdb/samdb/cracknames.c - fix another memory leak
       via  f156c34 s4:kdc/kpasswdd.c - fix memory leaks
       via  f1db3c5 s4:auth/gensec/gensec_krb5.c - fix/reorder memory free operations
       via  ee311be s4:auth/gensec/gensec_krb5.c - remove a pointless "nt_status" test
      from  3fb5ae6 s4:auth/kerberos/kerberos_pac.c - fix another memory leak regarding the KRB principal

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 536622e7d1b9944a4455be4d4c3e83146659acbb
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Sat Dec 4 16:39:01 2010 +0100

    s4:dsdb/samdb/cracknames.c - fix another memory leak
    
    Autobuild-User: Matthias Dieter Wallnöfer <mdw at samba.org>
    Autobuild-Date: Sat Dec  4 17:26:39 CET 2010 on sn-devel-104

commit f156c340b4283593c858a3ae6dc7ec9702381331
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Sat Dec 4 16:38:45 2010 +0100

    s4:kdc/kpasswdd.c - fix memory leaks

commit f1db3c52de6e5a68efe697a9af3497251c30f8fb
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Sat Dec 4 16:38:02 2010 +0100

    s4:auth/gensec/gensec_krb5.c - fix/reorder memory free operations
    
    To prevent memory leaks

commit ee311beabe0dd9f904f05a4c8d8bab065eda1fb7
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date:   Sat Dec 4 16:36:27 2010 +0100

    s4:auth/gensec/gensec_krb5.c - remove a pointless "nt_status" test
    
    There is no operation which sets the "nt_status" before the "if".

-----------------------------------------------------------------------

Summary of changes:
 source4/auth/gensec/gensec_krb5.c |   29 ++++++++++++++++++-----------
 source4/dsdb/samdb/cracknames.c   |    1 +
 source4/kdc/kpasswdd.c            |   17 +++++++++++++++--
 3 files changed, 34 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/auth/gensec/gensec_krb5.c b/source4/auth/gensec/gensec_krb5.c
index b0ab3f6..fc96e38 100644
--- a/source4/auth/gensec/gensec_krb5.c
+++ b/source4/auth/gensec/gensec_krb5.c
@@ -153,6 +153,7 @@ static NTSTATUS gensec_krb5_start(struct gensec_security *gensec_security, bool
 				(struct sockaddr *) &ss,
 				sizeof(struct sockaddr_storage));
 		if (socklen < 0) {
+			talloc_free(gensec_krb5_state);
 			return NT_STATUS_INTERNAL_ERROR;
 		}
 		ret = krb5_sockaddr2address(gensec_krb5_state->smb_krb5_context->krb5_context,
@@ -175,6 +176,7 @@ static NTSTATUS gensec_krb5_start(struct gensec_security *gensec_security, bool
 				(struct sockaddr *) &ss,
 				sizeof(struct sockaddr_storage));
 		if (socklen < 0) {
+			talloc_free(gensec_krb5_state);
 			return NT_STATUS_INTERNAL_ERROR;
 		}
 		ret = krb5_sockaddr2address(gensec_krb5_state->smb_krb5_context->krb5_context,
@@ -633,6 +635,7 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
 		DEBUG(1, ("Unable to parse client principal: %s\n",
 			  smb_get_krb5_error_message(context, 
 						     ret, mem_ctx)));
+		krb5_free_principal(context, client_principal);
 		talloc_free(mem_ctx);
 		return NT_STATUS_NO_MEMORY;
 	}
@@ -646,8 +649,9 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
 			  principal_string,
 			  smb_get_krb5_error_message(context, 
 						     ret, mem_ctx)));
-		krb5_free_principal(context, client_principal);
 		free(principal_string);
+		krb5_free_principal(context, client_principal);
+		talloc_free(mem_ctx);
 		return NT_STATUS_ACCESS_DENIED;
 	} else if (ret) {
 		/* NO pac */
@@ -664,29 +668,26 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
 											     principal_string,
 											     NULL, &server_info);
 			if (!NT_STATUS_IS_OK(nt_status)) {
+				free(principal_string);
+				krb5_free_principal(context, client_principal);
 				talloc_free(mem_ctx);
 				return nt_status;
 			}
 		} else {
 			DEBUG(1, ("Unable to find PAC in ticket from %s, failing to allow access\n",
 				  principal_string));
-			return NT_STATUS_ACCESS_DENIED;
-		}
-
-		krb5_free_principal(context, client_principal);
-		free(principal_string);
-		
-		if (!NT_STATUS_IS_OK(nt_status)) {
+			free(principal_string);
+			krb5_free_principal(context, client_principal);
 			talloc_free(mem_ctx);
-			return nt_status;
+			return NT_STATUS_ACCESS_DENIED;
 		}
 	} else {
 		/* Found pac */
 		union netr_Validation validation;
-		free(principal_string);
 
 		pac = data_blob_talloc(mem_ctx, pac_data.data, pac_data.length);
 		if (!pac.data) {
+			free(principal_string);
 			krb5_free_principal(context, client_principal);
 			talloc_free(mem_ctx);
 			return NT_STATUS_NO_MEMORY;
@@ -699,9 +700,10 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
 						    NULL, gensec_krb5_state->keyblock,
 						    client_principal,
 						    gensec_krb5_state->ticket->ticket.authtime, NULL);
-		krb5_free_principal(context, client_principal);
 
 		if (!NT_STATUS_IS_OK(nt_status)) {
+			free(principal_string);
+			krb5_free_principal(context, client_principal);
 			talloc_free(mem_ctx);
 			return nt_status;
 		}
@@ -712,11 +714,16 @@ static NTSTATUS gensec_krb5_session_info(struct gensec_security *gensec_security
 								 3, &validation,
 								 &server_info); 
 		if (!NT_STATUS_IS_OK(nt_status)) {
+			free(principal_string);
+			krb5_free_principal(context, client_principal);
 			talloc_free(mem_ctx);
 			return nt_status;
 		}
 	}
 
+	free(principal_string);
+	krb5_free_principal(context, client_principal);
+
 	/* references the server_info into the session_info */
 	nt_status = gensec_generate_session_info(mem_ctx, gensec_security, server_info, &session_info);
 
diff --git a/source4/dsdb/samdb/cracknames.c b/source4/dsdb/samdb/cracknames.c
index 0b7b6ed..1964e13 100644
--- a/source4/dsdb/samdb/cracknames.c
+++ b/source4/dsdb/samdb/cracknames.c
@@ -649,6 +649,7 @@ WERROR DsCrackNameOneName(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 						      strcspn(principal->name.name_string.val[1], "."));
 			if (computer_name == NULL) {
 				krb5_free_principal(smb_krb5_context->krb5_context, principal);
+				free(unparsed_name_short);
 				return WERR_NOMEM;
 			}
 
diff --git a/source4/kdc/kpasswdd.c b/source4/kdc/kpasswdd.c
index 7d7e98b..6f4c84b 100644
--- a/source4/kdc/kpasswdd.c
+++ b/source4/kdc/kpasswdd.c
@@ -300,16 +300,27 @@ static bool kpasswd_process_request(struct kdc_server *kdc,
 
 		if ((chpw.targname && !chpw.targrealm)
 		    || (!chpw.targname && chpw.targrealm)) {
+			free_ChangePasswdDataMS(&chpw);
 			return kpasswdd_make_error_reply(kdc, mem_ctx,
 							KRB5_KPASSWD_MALFORMED,
 							"Realm and principal must be both present, or neither present",
 							reply);
 		}
 		if (chpw.targname && chpw.targrealm) {
-			krb5_build_principal_ext(kdc->smb_krb5_context->krb5_context,
-						 &principal, strlen(*chpw.targrealm), *chpw.targrealm, 0);
+			ret = krb5_build_principal_ext(kdc->smb_krb5_context->krb5_context,
+						       &principal,
+						       strlen(*chpw.targrealm),
+						       *chpw.targrealm, 0);
+			if (ret) {
+				free_ChangePasswdDataMS(&chpw);
+				return kpasswdd_make_error_reply(kdc, mem_ctx,
+								KRB5_KPASSWD_MALFORMED,
+								"failed to get principal",
+								reply);
+			}
 			if (copy_PrincipalName(chpw.targname, &principal->name)) {
 				free_ChangePasswdDataMS(&chpw);
+				krb5_free_principal(context, principal);
 				return kpasswdd_make_error_reply(kdc, mem_ctx,
 								KRB5_KPASSWD_MALFORMED,
 								"failed to extract principal to set",
@@ -349,6 +360,7 @@ static bool kpasswd_process_request(struct kdc_server *kdc,
 
 		samdb = samdb_connect(mem_ctx, kdc->task->event_ctx, kdc->task->lp_ctx, session_info, 0);
 		if (!samdb) {
+			free(set_password_on_princ);
 			return kpasswdd_make_error_reply(kdc, mem_ctx,
 							 KRB5_KPASSWD_HARDERROR,
 							 "Unable to open database!",
@@ -362,6 +374,7 @@ static bool kpasswd_process_request(struct kdc_server *kdc,
 			  set_password_on_princ));
 		ret = ldb_transaction_start(samdb);
 		if (ret != LDB_SUCCESS) {
+			free(set_password_on_princ);
 			status = NT_STATUS_TRANSACTION_ABORTED;
 			return kpasswd_make_pwchange_reply(kdc, mem_ctx,
 							   status,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list