diff options
author | Stefan Metzmacher <metze@samba.org> | 2018-12-10 22:42:51 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2019-01-12 03:13:38 +0100 |
commit | 5cbcc78a40e46651c6d0a35e02448e172aae7c2c (patch) | |
tree | 3cbc426d9873f213726f78d6311bd1774289444a /source4 | |
parent | c76a5be87bf8985d54e82a32df3abf855a616134 (diff) | |
download | samba-5cbcc78a40e46651c6d0a35e02448e172aae7c2c.tar.gz |
s4:rpc_server/netlogon: make use of dcesrv_iface_state_{create,find}_conn()
BUG: https://bugzilla.samba.org/show_bug.cgi?id=7113
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11892
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source4')
-rw-r--r-- | source4/rpc_server/netlogon/dcerpc_netlogon.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/source4/rpc_server/netlogon/dcerpc_netlogon.c b/source4/rpc_server/netlogon/dcerpc_netlogon.c index c1237933e68..21374a209fb 100644 --- a/source4/rpc_server/netlogon/dcerpc_netlogon.c +++ b/source4/rpc_server/netlogon/dcerpc_netlogon.c @@ -63,6 +63,7 @@ static NTSTATUS dcesrv_interface_netlogon_bind(struct dcesrv_call_state *dce_cal return dcesrv_interface_bind_reject_connect(dce_call, iface); } +#define NETLOGON_SERVER_PIPE_STATE_MAGIC 0x4f555358 struct netlogon_server_pipe_state { struct netr_Credential client_challenge; struct netr_Credential server_challenge; @@ -71,19 +72,21 @@ struct netlogon_server_pipe_state { static NTSTATUS dcesrv_netr_ServerReqChallenge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct netr_ServerReqChallenge *r) { - struct netlogon_server_pipe_state *pipe_state = - talloc_get_type(dce_call->context->private_data, struct netlogon_server_pipe_state); + struct netlogon_server_pipe_state *pipe_state = NULL; NTSTATUS ntstatus; ZERO_STRUCTP(r->out.return_credentials); - if (pipe_state) { - talloc_free(pipe_state); - dce_call->context->private_data = NULL; - } + pipe_state = dcesrv_iface_state_find_conn(dce_call, + NETLOGON_SERVER_PIPE_STATE_MAGIC, + struct netlogon_server_pipe_state); + TALLOC_FREE(pipe_state); - pipe_state = talloc(dce_call->context, struct netlogon_server_pipe_state); - NT_STATUS_HAVE_NO_MEMORY(pipe_state); + pipe_state = talloc_zero(dce_call, + struct netlogon_server_pipe_state); + if (pipe_state == NULL) { + return NT_STATUS_NO_MEMORY; + } pipe_state->client_challenge = *r->in.credentials; @@ -92,13 +95,19 @@ static NTSTATUS dcesrv_netr_ServerReqChallenge(struct dcesrv_call_state *dce_cal *r->out.return_credentials = pipe_state->server_challenge; - dce_call->context->private_data = pipe_state; + ntstatus = dcesrv_iface_state_store_conn(dce_call, + NETLOGON_SERVER_PIPE_STATE_MAGIC, + pipe_state); + if (!NT_STATUS_IS_OK(ntstatus)) { + return ntstatus; + } ntstatus = schannel_save_challenge(dce_call->conn->dce_ctx->lp_ctx, &pipe_state->client_challenge, &pipe_state->server_challenge, r->in.computer_name); if (!NT_STATUS_IS_OK(ntstatus)) { + TALLOC_FREE(pipe_state); return ntstatus; } @@ -117,8 +126,7 @@ static NTSTATUS dcesrv_netr_ServerAuthenticate3_helper( const char **trust_account_in_db, struct dom_sid **sid) { - struct netlogon_server_pipe_state *pipe_state = - talloc_get_type(dce_call->context->private_data, struct netlogon_server_pipe_state); + struct netlogon_server_pipe_state *pipe_state = NULL; bool challenge_valid = false; struct netlogon_server_pipe_state challenge; struct netlogon_creds_CredentialState *creds; @@ -142,9 +150,10 @@ static NTSTATUS dcesrv_netr_ServerAuthenticate3_helper( ZERO_STRUCTP(r->out.return_credentials); *r->out.rid = 0; + pipe_state = dcesrv_iface_state_find_conn(dce_call, + NETLOGON_SERVER_PIPE_STATE_MAGIC, + struct netlogon_server_pipe_state); if (pipe_state != NULL) { - dce_call->context->private_data = NULL; - /* * If we had a challenge remembered on the connection * consider this for usage. This can't be cleanup |