From e60ed80754f1f51c74bc338cc3a81d12f49d9687 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 16 Jul 2010 18:23:55 -0400 Subject: s3-auth: Simplify how we free the auth_context Turn the freeing function into a destructor and attach it to the auth_context. Make all callers TALLOC_FREE() the auth_context instead of calling the free function. Signed-off-by: Andrew Bartlett --- source3/auth/auth.c | 34 ++++++++++++++++++---------------- source3/auth/auth_compat.c | 2 +- source3/auth/auth_ntlmssp.c | 2 +- source3/include/auth.h | 1 - source3/rpc_server/srv_netlog_nt.c | 2 +- source3/smbd/negprot.c | 3 +-- source3/smbd/server_exit.c | 3 +-- source3/smbd/sesssetup.c | 7 +++---- 8 files changed, 26 insertions(+), 28 deletions(-) diff --git a/source3/auth/auth.c b/source3/auth/auth.c index a52dab9f01..5dc1d970d6 100644 --- a/source3/auth/auth.c +++ b/source3/auth/auth.c @@ -322,38 +322,40 @@ static NTSTATUS check_ntlm_password(const struct auth_context *auth_context, Clear out a auth_context, and destroy the attached TALLOC_CTX ***************************************************************************/ -static void free_auth_context(struct auth_context **auth_context) +static int auth_context_destructor(void *ptr) { - auth_methods *auth_method; + struct auth_context *ctx = talloc_get_type(ptr, struct auth_context); + struct auth_methods *am; - if (*auth_context) { - /* Free private data of context's authentication methods */ - for (auth_method = (*auth_context)->auth_method_list; auth_method; auth_method = auth_method->next) { - TALLOC_FREE(auth_method->private_data); - } - talloc_destroy(*auth_context); - *auth_context = NULL; + /* Free private data of context's authentication methods */ + for (am = ctx->auth_method_list; am; am = am->next) { + TALLOC_FREE(am->private_data); } + + return 0; } /*************************************************************************** Make a auth_info struct ***************************************************************************/ -static NTSTATUS make_auth_context(struct auth_context **auth_context) +static NTSTATUS make_auth_context(struct auth_context **auth_context) { - *auth_context = TALLOC_ZERO_P(talloc_autofree_context(), - struct auth_context); - if (!*auth_context) { + struct auth_context *ctx; + + ctx = talloc_zero(talloc_autofree_context(), struct auth_context); + if (!ctx) { DEBUG(0,("make_auth_context: talloc failed!\n")); return NT_STATUS_NO_MEMORY; } - (*auth_context)->check_ntlm_password = check_ntlm_password; - (*auth_context)->get_ntlm_challenge = get_ntlm_challenge; - (*auth_context)->free = free_auth_context; + ctx->check_ntlm_password = check_ntlm_password; + ctx->get_ntlm_challenge = get_ntlm_challenge; + + talloc_set_destructor((TALLOC_CTX *)ctx, auth_context_destructor); + *auth_context = ctx; return NT_STATUS_OK; } diff --git a/source3/auth/auth_compat.c b/source3/auth/auth_compat.c index e90036f3ff..cdd4096654 100644 --- a/source3/auth/auth_compat.c +++ b/source3/auth/auth_compat.c @@ -59,7 +59,7 @@ NTSTATUS check_plaintext_password(const char *smb_name, nt_status = plaintext_auth_context->check_ntlm_password(plaintext_auth_context, user_info, server_info); - (plaintext_auth_context->free)(&plaintext_auth_context); + TALLOC_FREE(plaintext_auth_context); free_user_info(&user_info); return nt_status; } diff --git a/source3/auth/auth_ntlmssp.c b/source3/auth/auth_ntlmssp.c index 363f611431..44e9320191 100644 --- a/source3/auth/auth_ntlmssp.c +++ b/source3/auth/auth_ntlmssp.c @@ -332,7 +332,7 @@ void auth_ntlmssp_end(struct auth_ntlmssp_state **auth_ntlmssp_state) TALLOC_FREE(ans->ntlmssp_state); } if (ans->auth_context) { - ans->auth_context->free(&ans->auth_context); + TALLOC_FREE(ans->auth_context); } if (ans->server_info) { TALLOC_FREE(ans->server_info); diff --git a/source3/include/auth.h b/source3/include/auth.h index 17257b3433..b7089b8c0a 100644 --- a/source3/include/auth.h +++ b/source3/include/auth.h @@ -115,7 +115,6 @@ struct auth_context { const struct auth_usersupplied_info *user_info, struct auth_serversupplied_info **server_info); NTSTATUS (*nt_status_squash)(NTSTATUS nt_status); - void (*free)(struct auth_context **auth_context); }; typedef struct auth_methods diff --git a/source3/rpc_server/srv_netlog_nt.c b/source3/rpc_server/srv_netlog_nt.c index ebd37241a6..a57836aa75 100644 --- a/source3/rpc_server/srv_netlog_nt.c +++ b/source3/rpc_server/srv_netlog_nt.c @@ -1380,7 +1380,7 @@ static NTSTATUS _netr_LogonSamLogon_base(pipes_struct *p, user_info, &server_info); } - (auth_context->free)(&auth_context); + TALLOC_FREE(auth_context); free_user_info(&user_info); DEBUG(5,("%s: check_password returned status %s\n", diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index 755d3d9718..4d73216854 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -33,8 +33,7 @@ static void get_challenge(struct smbd_server_connection *sconn, uint8 buff[8]) if (sconn->smb1.negprot.auth_context) { DEBUG(3, ("get challenge: is this a secondary negprot? " "sconn->negprot.auth_context is non-NULL!\n")); - sconn->smb1.negprot.auth_context->free( - &sconn->smb1.negprot.auth_context); + TALLOC_FREE(sconn->smb1.negprot.auth_context); } DEBUG(10, ("get challenge: creating negprot_global_auth_context\n")); diff --git a/source3/smbd/server_exit.c b/source3/smbd/server_exit.c index 97394aea96..1a330994b8 100644 --- a/source3/smbd/server_exit.c +++ b/source3/smbd/server_exit.c @@ -75,8 +75,7 @@ static void exit_server_common(enum server_exit_reason how, change_to_root_user(); if (sconn && sconn->smb1.negprot.auth_context) { - struct auth_context *a = sconn->smb1.negprot.auth_context; - a->free(&sconn->smb1.negprot.auth_context); + TALLOC_FREE(sconn->smb1.negprot.auth_context); } if (lp_log_writeable_files_on_exit()) { diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index 52fcd282a6..525bcafd09 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -150,14 +150,14 @@ static NTSTATUS check_guest_password(struct auth_serversupplied_info **server_in } if (!make_user_info_guest(&user_info)) { - (auth_context->free)(&auth_context); + TALLOC_FREE(auth_context); return NT_STATUS_NO_MEMORY; } nt_status = auth_context->check_ntlm_password(auth_context, user_info, server_info); - (auth_context->free)(&auth_context); + TALLOC_FREE(auth_context); free_user_info(&user_info); return nt_status; } @@ -1751,8 +1751,7 @@ void reply_sesssetup_and_X(struct smb_request *req) user_info, &server_info); - (plaintext_auth_context->free)( - &plaintext_auth_context); + TALLOC_FREE(plaintext_auth_context); } } } -- cgit