mirror of
https://github.com/samba-team/samba.git
synced 2025-03-03 12:58:35 +03:00
s3:smb2_sesssetup: remove unused smbd_smb2_session_setup_* destructors
The cleanup of a failing session setup is now handled in smbd_smb2_session_setup_wrap_*(). Bug: https://bugzilla.samba.org/show_bug.cgi?id=11182 Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
parent
50aeb6b38b
commit
5871d3da87
@ -448,94 +448,12 @@ struct smbd_smb2_session_setup_state {
|
||||
uint16_t out_session_flags;
|
||||
DATA_BLOB out_security_buffer;
|
||||
uint64_t out_session_id;
|
||||
/* The following pointer is owned by state->session. */
|
||||
struct smbd_smb2_session_setup_state **pp_self_ref;
|
||||
};
|
||||
|
||||
static int pp_self_ref_destructor(struct smbd_smb2_session_setup_state **pp_state)
|
||||
{
|
||||
(*pp_state)->session = NULL;
|
||||
/*
|
||||
* To make things clearer, ensure the pp_self_ref
|
||||
* pointer is nulled out. We're never going to
|
||||
* access this again.
|
||||
*/
|
||||
(*pp_state)->pp_self_ref = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smbd_smb2_session_setup_state_destructor(struct smbd_smb2_session_setup_state *state)
|
||||
{
|
||||
struct smbXsrv_connection *xconn;
|
||||
struct smbd_smb2_request *preq;
|
||||
|
||||
/*
|
||||
* If state->session is not NULL,
|
||||
* we move the session from the session table to the request on failure
|
||||
* so that the error response can be correctly signed, but the session
|
||||
* is then really deleted when the request is done.
|
||||
*/
|
||||
|
||||
if (state->session == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
state->session->status = NT_STATUS_USER_SESSION_DELETED;
|
||||
state->smb2req->session = talloc_move(state->smb2req, &state->session);
|
||||
|
||||
/*
|
||||
* We own the session now - we don't need the
|
||||
* tag talloced on session that keeps track of session independently.
|
||||
*/
|
||||
TALLOC_FREE(state->pp_self_ref);
|
||||
|
||||
/*
|
||||
* We've made this session owned by the current request.
|
||||
* Ensure that any outstanding requests don't also refer
|
||||
* to it.
|
||||
*/
|
||||
xconn = state->smb2req->xconn;
|
||||
|
||||
for (preq = xconn->smb2.requests; preq != NULL; preq = preq->next) {
|
||||
if (preq == state->smb2req) {
|
||||
continue;
|
||||
}
|
||||
if (preq->session == state->smb2req->session) {
|
||||
preq->session = NULL;
|
||||
/*
|
||||
* If we no longer have a session we can't
|
||||
* sign or encrypt replies.
|
||||
*/
|
||||
preq->do_signing = false;
|
||||
preq->do_encryption = false;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void smbd_smb2_session_setup_gensec_done(struct tevent_req *subreq);
|
||||
static void smbd_smb2_session_setup_previous_done(struct tevent_req *subreq);
|
||||
static void smbd_smb2_session_setup_auth_return(struct tevent_req *req);
|
||||
|
||||
/************************************************************************
|
||||
We have to tag the state->session pointer with memory talloc'ed
|
||||
on it to ensure it gets NULL'ed out if the underlying struct smbXsrv_session
|
||||
is deleted by shutdown whilst this request is in flight.
|
||||
************************************************************************/
|
||||
|
||||
static NTSTATUS tag_state_session_ptr(struct smbd_smb2_session_setup_state *state)
|
||||
{
|
||||
state->pp_self_ref = talloc_zero(state->session,
|
||||
struct smbd_smb2_session_setup_state *);
|
||||
if (state->pp_self_ref == NULL) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
*state->pp_self_ref = state;
|
||||
talloc_set_destructor(state->pp_self_ref, pp_self_ref_destructor);
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
static struct tevent_req *smbd_smb2_session_setup_send(TALLOC_CTX *mem_ctx,
|
||||
struct tevent_context *ev,
|
||||
struct smbd_smb2_request *smb2req,
|
||||
@ -577,8 +495,6 @@ static struct tevent_req *smbd_smb2_session_setup_send(TALLOC_CTX *mem_ctx,
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
||||
talloc_set_destructor(state, smbd_smb2_session_setup_state_destructor);
|
||||
|
||||
if (state->in_session_id == 0) {
|
||||
/* create a new session */
|
||||
status = smbXsrv_session_create(state->smb2req->xconn,
|
||||
@ -609,11 +525,6 @@ static struct tevent_req *smbd_smb2_session_setup_send(TALLOC_CTX *mem_ctx,
|
||||
}
|
||||
}
|
||||
|
||||
status = tag_state_session_ptr(state);
|
||||
if (tevent_req_nterror(req, status)) {
|
||||
return tevent_req_post(req, ev);
|
||||
}
|
||||
|
||||
if (state->session->gensec == NULL) {
|
||||
status = auth_generic_prepare(state->session,
|
||||
state->smb2req->xconn->remote_address,
|
||||
@ -668,9 +579,6 @@ static void smbd_smb2_session_setup_gensec_done(struct tevent_req *subreq)
|
||||
|
||||
if (NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
|
||||
state->out_session_id = state->session->global->session_wire_id;
|
||||
/* we want to keep the session */
|
||||
state->session = NULL;
|
||||
TALLOC_FREE(state->pp_self_ref);
|
||||
tevent_req_nterror(req, status);
|
||||
return;
|
||||
}
|
||||
@ -735,9 +643,6 @@ static void smbd_smb2_session_setup_auth_return(struct tevent_req *req)
|
||||
if (tevent_req_nterror(req, status)) {
|
||||
return;
|
||||
}
|
||||
/* we want to keep the session */
|
||||
state->session = NULL;
|
||||
TALLOC_FREE(state->pp_self_ref);
|
||||
tevent_req_done(req);
|
||||
return;
|
||||
}
|
||||
@ -752,9 +657,6 @@ static void smbd_smb2_session_setup_auth_return(struct tevent_req *req)
|
||||
return;
|
||||
}
|
||||
|
||||
/* we want to keep the session */
|
||||
state->session = NULL;
|
||||
TALLOC_FREE(state->pp_self_ref);
|
||||
tevent_req_done(req);
|
||||
return;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user