diff options
author | Michael Adam <obnox@samba.org> | 2013-05-22 19:53:12 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2013-06-04 11:07:11 -0700 |
commit | 63ac88d40206e3080494e3a4f99858ce5cd6f393 (patch) | |
tree | 7c3208a551c2daf24a69e042ad5091cd1e45aba0 /source3/smbd | |
parent | e6beae4471491c5bfcabeb720c5e92183e78e886 (diff) | |
download | samba-63ac88d40206e3080494e3a4f99858ce5cd6f393.tar.gz samba-63ac88d40206e3080494e3a4f99858ce5cd6f393.tar.bz2 samba-63ac88d40206e3080494e3a4f99858ce5cd6f393.zip |
s3:smbd: remove code duplication in smb2_create_send()
Move the calls to smb2srv_open_recreate() from the parsing of
the create blobs (DHNC and DH2C) to a central place in the
open execution phase.
This is also where it should be called: in the durable reconnect
part, right before the call to SMB_VFS_DURABLE_RECONNECT()
Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/smb2_create.c | 76 |
1 files changed, 25 insertions, 51 deletions
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c index 60ba73926d..11b3b7f438 100644 --- a/source3/smbd/smb2_create.c +++ b/source3/smbd/smb2_create.c @@ -552,6 +552,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, uint32_t durable_timeout_msec = 0; bool do_durable_reconnect = false; struct smb2_create_blob *dh2q = NULL; + uint64_t persistent_id = 0; exta = smb2_create_blob_find(&in_context_blobs, SMB2_CREATE_TAG_EXTA); @@ -683,41 +684,13 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, } if (dhnc) { - NTTIME now = timeval_to_nttime(&smb2req->request_time); - uint64_t persistent_id; - persistent_id = BVAL(dhnc->data.data, 0); - status = smb2srv_open_recreate(smb2req->sconn->conn, - smb1req->conn->session_info, - persistent_id, create_guid, - now, &op); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(3, ("smbd_smb2_create_send: " - "smb2srv_open_recreate v1 failed: %s\n", - nt_errstr(status))); - tevent_req_nterror(req, status); - return tevent_req_post(req, ev); - } - - DEBUG(10, ("smb2_create_send: DHNC: %s recreate the " - "smb2srv_open struct for a durable handle.\n", - op->global->durable ? "did" : "could not")); - - if (!op->global->durable) { - talloc_free(op); - tevent_req_nterror(req, - NT_STATUS_OBJECT_NAME_NOT_FOUND); - return tevent_req_post(req, ev); - } - do_durable_reconnect = true; } if (dh2c) { const uint8_t *p = dh2c->data.data; - NTTIME now = timeval_to_nttime(&smb2req->request_time); - uint64_t persistent_id; DATA_BLOB create_guid_blob; persistent_id = BVAL(p, 0); @@ -729,29 +702,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, return tevent_req_post(req, ev); } - status = smb2srv_open_recreate(smb2req->sconn->conn, - smb1req->conn->session_info, - persistent_id, create_guid, - now, &op); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(3, ("smbd_smb2_create_send: " - "smb2srv_open_recreate v2 failed: %s\n", - nt_errstr(status))); - tevent_req_nterror(req, status); - return tevent_req_post(req, ev); - } - - DEBUG(10, ("smb2_create_send: DH2C: %s recreate the " - "smb2srv_open struct for a durable handle.\n", - op->global->durable ? "did" : "could not")); - - if (!op->global->durable) { - talloc_free(op); - tevent_req_nterror(req, - NT_STATUS_OBJECT_NAME_NOT_FOUND); - return tevent_req_post(req, ev); - } - do_durable_reconnect = true; } @@ -813,6 +763,30 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx, */ if (do_durable_reconnect) { DATA_BLOB new_cookie = data_blob_null; + NTTIME now = timeval_to_nttime(&smb2req->request_time); + + status = smb2srv_open_recreate(smb2req->sconn->conn, + smb1req->conn->session_info, + persistent_id, create_guid, + now, &op); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(3, ("smbd_smb2_create_send: " + "smb2srv_open_recreate failed: %s\n", + nt_errstr(status))); + tevent_req_nterror(req, status); + return tevent_req_post(req, ev); + } + + DEBUG(10, ("smb2_create_send: %s to recreate the " + "smb2srv_open struct for a durable handle.\n", + op->global->durable ? "succeded" : "failed")); + + if (!op->global->durable) { + talloc_free(op); + tevent_req_nterror(req, + NT_STATUS_OBJECT_NAME_NOT_FOUND); + return tevent_req_post(req, ev); + } status = SMB_VFS_DURABLE_RECONNECT(smb1req->conn, smb1req, |