Author: abartlet Date: 2006-01-31 01:50:54 +0000 (Tue, 31 Jan 2006) New Revision: 13247
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=13247 Log: Try to make better use of talloc in the auth/ and auth/gensec code. We don't want temporary memory hanging around on the long-term contexts. Andrew Bartlett Modified: branches/SAMBA_4_0/source/auth/auth_sam.c branches/SAMBA_4_0/source/auth/gensec/gensec_gssapi.c branches/SAMBA_4_0/source/auth/gensec/gensec_krb5.c Changeset: Modified: branches/SAMBA_4_0/source/auth/auth_sam.c =================================================================== --- branches/SAMBA_4_0/source/auth/auth_sam.c 2006-01-31 01:49:56 UTC (rev 13246) +++ branches/SAMBA_4_0/source/auth/auth_sam.c 2006-01-31 01:50:54 UTC (rev 13247) @@ -616,14 +616,14 @@ return nt_status; } - nt_status = authsam_make_server_info(mem_ctx, sam_ctx, msgs[0], msgs_domain_ref[0], + nt_status = authsam_make_server_info(tmp_ctx, sam_ctx, msgs[0], msgs_domain_ref[0], user_sess_key, lm_sess_key, server_info); - if (!NT_STATUS_IS_OK(nt_status)) { - talloc_free(tmp_ctx); - return nt_status; + if (NT_STATUS_IS_OK(nt_status)) { + talloc_steal(mem_ctx, *server_info); } - return NT_STATUS_OK; + talloc_free(tmp_ctx); + return nt_status; } static NTSTATUS authsam_check_password_internals(struct auth_method_context *ctx, Modified: branches/SAMBA_4_0/source/auth/gensec/gensec_gssapi.c =================================================================== --- branches/SAMBA_4_0/source/auth/gensec/gensec_gssapi.c 2006-01-31 01:49:56 UTC (rev 13246) +++ branches/SAMBA_4_0/source/auth/gensec/gensec_gssapi.c 2006-01-31 01:50:54 UTC (rev 13247) @@ -759,7 +759,7 @@ } static NTSTATUS gensec_gssapi_session_info(struct gensec_security *gensec_security, - struct auth_session_info **_session_info) + struct auth_session_info **_session_info) { NTSTATUS nt_status; TALLOC_CTX *mem_ctx; @@ -873,13 +873,17 @@ } /* references the server_info into the session_info */ - nt_status = auth_generate_session_info(gensec_gssapi_state, server_info, &session_info); - talloc_free(mem_ctx); - talloc_free(server_info); - NT_STATUS_NOT_OK_RETURN(nt_status); + nt_status = auth_generate_session_info(mem_ctx, server_info, &session_info); + if (!NT_STATUS_IS_OK(nt_status)) { + talloc_free(mem_ctx); + return nt_status; + } nt_status = gensec_gssapi_session_key(gensec_security, &session_info->session_key); - NT_STATUS_NOT_OK_RETURN(nt_status); + if (!NT_STATUS_IS_OK(nt_status)) { + talloc_free(mem_ctx); + return nt_status; + } if (!(gensec_gssapi_state->got_flags & GSS_C_DELEG_FLAG)) { DEBUG(10, ("gensec_gssapi: NO delegated credentials supplied by client\n")); @@ -888,6 +892,7 @@ DEBUG(10, ("gensec_gssapi: delegated credentials supplied by client\n")); session_info->credentials = cli_credentials_init(session_info); if (!session_info->credentials) { + talloc_free(mem_ctx); return NT_STATUS_NO_MEMORY; } @@ -897,11 +902,13 @@ gensec_gssapi_state->delegated_cred_handle, CRED_SPECIFIED); if (ret) { + talloc_free(mem_ctx); return NT_STATUS_NO_MEMORY; } /* It has been taken from this place... */ gensec_gssapi_state->delegated_cred_handle = GSS_C_NO_CREDENTIAL; } + talloc_steal(gensec_gssapi_state, session_info); *_session_info = session_info; return NT_STATUS_OK; Modified: branches/SAMBA_4_0/source/auth/gensec/gensec_krb5.c =================================================================== --- branches/SAMBA_4_0/source/auth/gensec/gensec_krb5.c 2006-01-31 01:49:56 UTC (rev 13246) +++ branches/SAMBA_4_0/source/auth/gensec/gensec_krb5.c 2006-01-31 01:50:54 UTC (rev 13247) @@ -546,6 +546,7 @@ } else { pac = data_blob_talloc(mem_ctx, pac_data.data, pac_data.length); if (!pac.data) { + talloc_free(mem_ctx); return NT_STATUS_NO_MEMORY; } @@ -554,6 +555,7 @@ DEBUG(5, ("krb5_ticket_get_client failed to get cleint principal: %s\n", smb_get_krb5_error_message(context, ret, mem_ctx))); + talloc_free(mem_ctx); return NT_STATUS_NO_MEMORY; } @@ -568,12 +570,11 @@ if (NT_STATUS_IS_OK(nt_status)) { union netr_Validation validation; validation.sam3 = &logon_info->info3; - nt_status = make_server_info_netlogon_validation(gensec_krb5_state, + nt_status = make_server_info_netlogon_validation(mem_ctx, NULL, 3, &validation, &server_info); } - talloc_free(mem_ctx); } @@ -590,6 +591,7 @@ DEBUG(5, ("krb5_ticket_get_client failed to get cleint principal: %s\n", smb_get_krb5_error_message(context, ret, mem_ctx))); + talloc_free(mem_ctx); return NT_STATUS_NO_MEMORY; } @@ -597,6 +599,7 @@ client_principal, &principal_string); krb5_free_principal(context, client_principal); if (ret) { + talloc_free(mem_ctx); return NT_STATUS_NO_MEMORY; } @@ -611,16 +614,24 @@ } /* references the server_info into the session_info */ - nt_status = auth_generate_session_info(gensec_krb5_state, server_info, &session_info); - talloc_free(mem_ctx); + nt_status = auth_generate_session_info(mem_ctx, server_info, &session_info); - NT_STATUS_NOT_OK_RETURN(nt_status); + if (!NT_STATUS_IS_OK(nt_status)) { + talloc_free(mem_ctx); + return nt_status; + } nt_status = gensec_krb5_session_key(gensec_security, &session_info->session_key); - NT_STATUS_NOT_OK_RETURN(nt_status); + if (!NT_STATUS_IS_OK(nt_status)) { + talloc_free(mem_ctx); + return nt_status; + } + *_session_info = session_info; + talloc_steal(gensec_krb5_state, session_info); + talloc_free(mem_ctx); return NT_STATUS_OK; }
