[SCM] Samba Shared Repository - branch master updated
Ralph Böhme
slow at samba.org
Sat Oct 21 16:09:02 UTC 2017
The branch, master has been updated
via e6f3631 s3/smbd: update some more DEBUG macros in smbd_smb2_create_send
via 18a7ea8 s3/smbd: use early returns in smbd_smb2_create_send
via e55949c s3/smbd: factor out smbd_smb2_create_after_exec from smbd_smb2_create_send
via 6478a2b s3/smbd: factor out smbd_smb2_create_before_exec from smbd_smb2_create_send
via 403f024 s3/smbd: remove all stack variables of smbd_smb2_create_send into smbd_smb2_create_state
via cadf4d5 s3/smbd: move create ctx extraction and validation to a helper func
via 8229473 s3/smbd: move create contexts into smbd_smb2_create_state
via 4cbd2f1 s3/smbd: remove unneeded args from smbd_smb2_create_finish
via 4bb7acf s3/smbd: move info into smbd_smb2_create_state
via b0ee889 s3/smbd: add in_create_disposition to smbd_smb2_create_state
via 127715c s3/smbd: add in_oplock_level to smbd_smb2_create_state
via dafb1ad s3/smbd: move requested_oplock_level into smbd_smb2_create_state
via 0a8263a s3/smbd: move replay_operation into smbd_smb2_create_state
via 29d654a s3/smbd: move result into smbd_smb2_create_state
via bb072ba s3/smbd: leverage early return added in the previous commit
via b11ce87 s3/smbd: factor out smbd_smb2_create_finish from smbd_smb2_create_send
via ef7cabb s3/smbd: modernize a DEBUG statement
via 4179a3e s3/smbd: move some setup code in smbd_smb2_create_send a few lines up
via 7c5d996 s3/smbd: add tevent context to smbd_smb2_create_state
via 718fa0e s3/smbd: use struct initializer for smbd_smb2_create_state
from 629fc066 lib: Remove fncall.c
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit e6f3631eba863e6dda007b4e2d9a3b7ef3d49f35
Author: Ralph Boehme <slow at samba.org>
Date: Sat Jul 22 19:34:25 2017 +0200
s3/smbd: update some more DEBUG macros in smbd_smb2_create_send
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
Autobuild-User(master): Ralph Böhme <slow at samba.org>
Autobuild-Date(master): Sat Oct 21 18:08:46 CEST 2017 on sn-devel-144
commit 18a7ea8c0f76fa9c969e6e8563d1f8ad8c65a9c2
Author: Ralph Boehme <slow at samba.org>
Date: Fri Jul 21 18:59:55 2017 +0200
s3/smbd: use early returns in smbd_smb2_create_send
Now that we have the nice smbd_smb2_create_after_exec() and
smbd_smb2_create_finish() functions, use early returns for the create
replay and durable handle reconnect case.
No change in behaviour, best viewed with
$ git show -w COMMIT
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit e55949c415b5acbeadb463f5eae1ad5782531748
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jul 20 16:14:31 2017 +0200
s3/smbd: factor out smbd_smb2_create_after_exec from smbd_smb2_create_send
No change in behaviour.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 6478a2b1fd983888f322facd454dd6601dd61bf2
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jul 20 16:14:31 2017 +0200
s3/smbd: factor out smbd_smb2_create_before_exec from smbd_smb2_create_send
No change in behaviour, best viewed with:
$ git show --diff-algorithm=histogram COMMIT
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 403f024de138b30fd9702c20dc2359255f31f64d
Author: Ralph Boehme <slow at samba.org>
Date: Fri Jul 21 18:02:05 2017 +0200
s3/smbd: remove all stack variables of smbd_smb2_create_send into smbd_smb2_create_state
This allows factoring out smbd_smb2_create_after|before_exec() in the
next steps.
Moving all variable in one big fell swoop instead of one per commit,
because if I'd miss to adjust a variable access the commit wouldn't
compile.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit cadf4d56eef527316565b5b9f1f1bd8bf3750b5b
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jul 20 12:51:37 2017 +0200
s3/smbd: move create ctx extraction and validation to a helper func
No change in behaviour.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 8229473347818f9865094c2000b788d51c23909b
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jul 20 12:15:19 2017 +0200
s3/smbd: move create contexts into smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 4cbd2f13bad8cf2bb96073b36238792f17a24db1
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jul 20 11:29:46 2017 +0200
s3/smbd: remove unneeded args from smbd_smb2_create_finish
The previous commits moved all arguments into smbd_smb2_create_state.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 4bb7acfe658ffce089b8265ca02e1c711c63c5f6
Author: Ralph Boehme <slow at samba.org>
Date: Sat Jul 22 18:49:50 2017 +0200
s3/smbd: move info into smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit b0ee889a0a6f97ff3c804655ec67a4aa2f863591
Author: Ralph Boehme <slow at samba.org>
Date: Sat Jul 22 18:47:17 2017 +0200
s3/smbd: add in_create_disposition to smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 127715c6658cde99d31d9256be0c93d662ee50fd
Author: Ralph Boehme <slow at samba.org>
Date: Sat Jul 22 18:43:33 2017 +0200
s3/smbd: add in_oplock_level to smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit dafb1ad4b65de92470711b876838a2d73e9203c8
Author: Ralph Boehme <slow at samba.org>
Date: Sat Jul 22 18:40:16 2017 +0200
s3/smbd: move requested_oplock_level into smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 0a8263a9d6a9187703c7e76a5c960e87a32deadc
Author: Ralph Boehme <slow at samba.org>
Date: Sat Jul 22 18:32:50 2017 +0200
s3/smbd: move replay_operation into smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 29d654a19ed2f88a2ea3d6a3742b688bc3019d6b
Author: Ralph Boehme <slow at samba.org>
Date: Sat Jul 22 15:31:05 2017 +0200
s3/smbd: move result into smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit bb072ba474b0d4526066cc881c63c0c839de20f2
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jul 19 19:07:55 2017 +0200
s3/smbd: leverage early return added in the previous commit
Now that the other cases handled in the if/else blocks do early returns,
we can move the logic handling file opens out of the final else block.
No change in behaviour, best viewed with
$ git show -w COMMIT
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit b11ce878574d3edf82f4002e60d905b1c79df3c9
Author: Ralph Boehme <slow at samba.org>
Date: Wed Jul 19 19:04:46 2017 +0200
s3/smbd: factor out smbd_smb2_create_finish from smbd_smb2_create_send
No change in behaviour.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit ef7cabb4185cfca7da398cd1af5c8c25c9977d62
Author: Ralph Boehme <slow at samba.org>
Date: Fri Jul 21 15:34:02 2017 +0200
s3/smbd: modernize a DEBUG statement
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 4179a3e67d390232d794d7a073b9b3110963c266
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jul 20 06:03:34 2017 +0200
s3/smbd: move some setup code in smbd_smb2_create_send a few lines up
This is just one of the last steps before splitting out large code parts
into _before() and _after() functions. No change in behaviour.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 7c5d996e7107e082e78eb94932f7e710ed7a93c9
Author: Ralph Boehme <slow at samba.org>
Date: Fri Jul 21 16:23:53 2017 +0200
s3/smbd: add tevent context to smbd_smb2_create_state
...and use it in everywhere in smbd_smb2_create_send().
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 718fa0e6e50852a6b9b50db28a770302fdacd911
Author: Ralph Boehme <slow at samba.org>
Date: Thu Jul 20 06:49:46 2017 +0200
s3/smbd: use struct initializer for smbd_smb2_create_state
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/smbd/smb2_create.c | 1552 +++++++++++++++++++++++---------------------
1 file changed, 828 insertions(+), 724 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index c4fe247..d34a5f7 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -428,6 +428,7 @@ static NTSTATUS smbd_smb2_create_durable_lease_check(struct smb_request *smb1req
}
struct smbd_smb2_create_state {
+ struct tevent_context *ev;
struct smbd_smb2_request *smb2req;
struct smb_request *smb1req;
bool open_was_deferred;
@@ -435,6 +436,43 @@ struct smbd_smb2_create_state {
struct timeval request_time;
struct file_id id;
struct deferred_open_record *open_rec;
+ files_struct *result;
+ bool replay_operation;
+ uint8_t in_oplock_level;
+ uint32_t in_create_disposition;
+ int requested_oplock_level;
+ int info;
+ char *fname;
+ struct ea_list *ea_list;
+ NTTIME max_access_time;
+ struct security_descriptor *sec_desc;
+ uint64_t allocation_size;
+ struct GUID _create_guid;
+ struct GUID *create_guid;
+ bool update_open;
+ bool durable_requested;
+ uint32_t durable_timeout_msec;
+ bool do_durable_reconnect;
+ uint64_t persistent_id;
+ struct smb2_lease lease;
+ struct smb2_lease *lease_ptr;
+ ssize_t lease_len;
+ bool need_replay_cache;
+ struct smbXsrv_open *op;
+
+ struct smb2_create_blob *dhnc;
+ struct smb2_create_blob *dh2c;
+ struct smb2_create_blob *dhnq;
+ struct smb2_create_blob *dh2q;
+ struct smb2_create_blob *rqls;
+ struct smb2_create_blob *exta;
+ struct smb2_create_blob *mxac;
+ struct smb2_create_blob *secd;
+ struct smb2_create_blob *alsi;
+ struct smb2_create_blob *twrp;
+ struct smb2_create_blob *qfid;
+ struct smb2_create_blob *svhdx;
+
uint8_t out_oplock_level;
uint32_t out_create_action;
struct timespec out_creation_ts;
@@ -449,103 +487,40 @@ struct smbd_smb2_create_state {
struct smb2_create_blobs *out_context_blobs;
};
-static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct smbd_smb2_request *smb2req,
- uint8_t in_oplock_level,
- uint32_t in_impersonation_level,
- uint32_t in_desired_access,
- uint32_t in_file_attributes,
- uint32_t in_share_access,
- uint32_t in_create_disposition,
- uint32_t in_create_options,
- const char *in_name,
- struct smb2_create_blobs in_context_blobs)
+static NTSTATUS smbd_smb2_create_fetch_create_ctx(
+ struct tevent_req *req,
+ struct smb2_create_blobs *in_context_blobs)
{
- struct tevent_req *req = NULL;
- struct smbd_smb2_create_state *state = NULL;
- NTSTATUS status;
- struct smb_request *smb1req = NULL;
- files_struct *result = NULL;
- int info;
- int requested_oplock_level;
- struct smb2_create_blob *dhnc = NULL;
- struct smb2_create_blob *dh2c = NULL;
- struct smb2_create_blob *dhnq = NULL;
- struct smb2_create_blob *dh2q = NULL;
- struct smb2_create_blob *rqls = NULL;
- bool replay_operation = false;
-
- if(lp_fake_oplocks(SNUM(smb2req->tcon->compat))) {
- requested_oplock_level = SMB2_OPLOCK_LEVEL_NONE;
- } else {
- requested_oplock_level = in_oplock_level;
- }
-
- req = tevent_req_create(mem_ctx, &state,
- struct smbd_smb2_create_state);
- if (req == NULL) {
- return NULL;
- }
- state->smb2req = smb2req;
-
- smb1req = smbd_smb2_fake_smb_request(smb2req);
- if (tevent_req_nomem(smb1req, req)) {
- return tevent_req_post(req, ev);
- }
- state->smb1req = smb1req;
-
- if (smb2req->subreq == NULL) {
- DEBUG(10,("smbd_smb2_create: name[%s]\n",
- in_name));
- } else {
- struct smbd_smb2_create_state *old_state = tevent_req_data(
- smb2req->subreq, struct smbd_smb2_create_state);
-
- DEBUG(10,("smbd_smb2_create_send: reentrant for file %s\n",
- in_name ));
-
- state->id = old_state->id;
- state->request_time = old_state->request_time;
- state->open_rec = talloc_move(state, &old_state->open_rec);
- state->open_was_deferred = old_state->open_was_deferred;
- }
-
- TALLOC_FREE(smb2req->subreq);
- smb2req->subreq = req;
-
- state->out_context_blobs = talloc_zero(state, struct smb2_create_blobs);
- if (tevent_req_nomem(state->out_context_blobs, req)) {
- return tevent_req_post(req, ev);
- }
-
- dhnq = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_DHNQ);
- dhnc = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_DHNC);
- dh2q = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_DH2Q);
- dh2c = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_DH2C);
- if (smb2req->xconn->smb2.server.capabilities & SMB2_CAP_LEASING) {
- rqls = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_RQLS);
- }
-
- if ((dhnc && dh2c) || (dhnc && dh2q) || (dh2c && dhnq) ||
- (dh2q && dh2c))
+ struct smbd_smb2_create_state *state = tevent_req_data(
+ req, struct smbd_smb2_create_state);
+
+ state->dhnq = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_DHNQ);
+ state->dhnc = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_DHNC);
+ state->dh2q = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_DH2Q);
+ state->dh2c = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_DH2C);
+ if (state->smb2req->xconn->smb2.server.capabilities & SMB2_CAP_LEASING) {
+ state->rqls = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_RQLS);
+ }
+
+ if (((state->dhnc != NULL) && (state->dh2c != NULL)) ||
+ ((state->dhnc != NULL) && (state->dh2q != NULL)) ||
+ ((state->dh2c != NULL) && (state->dhnq != NULL)) ||
+ ((state->dh2q != NULL) && (state->dh2c != NULL)))
{
/* not both are allowed at the same time */
- tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
- return tevent_req_post(req, ev);
+ return NT_STATUS_INVALID_PARAMETER;
}
- if (dhnc) {
+ if (state->dhnc != NULL) {
uint32_t num_blobs_allowed;
- if (dhnc->data.length != 16) {
- tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
- return tevent_req_post(req, ev);
+ if (state->dhnc->data.length != 16) {
+ return NT_STATUS_INVALID_PARAMETER;
}
/*
@@ -560,28 +535,26 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
* above.)
*/
- if (dhnq) {
+ if (state->dhnq != NULL) {
num_blobs_allowed = 2;
} else {
num_blobs_allowed = 1;
}
- if (rqls != NULL) {
+ if (state->rqls != NULL) {
num_blobs_allowed += 1;
}
- if (in_context_blobs.num_blobs != num_blobs_allowed) {
- tevent_req_nterror(req, NT_STATUS_OBJECT_NAME_NOT_FOUND);
- return tevent_req_post(req, ev);
+ if (in_context_blobs->num_blobs != num_blobs_allowed) {
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
}
- if (dh2c) {
+ if (state->dh2c!= NULL) {
uint32_t num_blobs_allowed;
- if (dh2c->data.length != 36) {
- tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
- return tevent_req_post(req, ev);
+ if (state->dh2c->data.length != 36) {
+ return NT_STATUS_INVALID_PARAMETER;
}
/*
@@ -598,776 +571,907 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
num_blobs_allowed = 1;
- if (rqls != NULL) {
+ if (state->rqls != NULL) {
num_blobs_allowed += 1;
}
- if (in_context_blobs.num_blobs != num_blobs_allowed) {
- tevent_req_nterror(req, NT_STATUS_OBJECT_NAME_NOT_FOUND);
- return tevent_req_post(req, ev);
+ if (in_context_blobs->num_blobs != num_blobs_allowed) {
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
}
+ state->exta = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_EXTA);
+ state->mxac = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_MXAC);
+ state->secd = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_SECD);
+ state->alsi = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_ALSI);
+ state->twrp = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_TWRP);
+ state->qfid = smb2_create_blob_find(in_context_blobs,
+ SMB2_CREATE_TAG_QFID);
+ if (state->smb2req->xconn->protocol >= PROTOCOL_SMB3_02) {
+ /*
+ * This was introduced with SMB3_02
+ */
+ state->svhdx = smb2_create_blob_find(
+ in_context_blobs, SVHDX_OPEN_DEVICE_CONTEXT);
+ }
+
+ return NT_STATUS_OK;
+}
+
+static void smbd_smb2_create_before_exec(struct tevent_req *req);
+static void smbd_smb2_create_after_exec(struct tevent_req *req);
+static void smbd_smb2_create_finish(struct tevent_req *req);
+
+static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct smbd_smb2_request *smb2req,
+ uint8_t in_oplock_level,
+ uint32_t in_impersonation_level,
+ uint32_t in_desired_access,
+ uint32_t in_file_attributes,
+ uint32_t in_share_access,
+ uint32_t in_create_disposition,
+ uint32_t in_create_options,
+ const char *in_name,
+ struct smb2_create_blobs in_context_blobs)
+{
+ struct tevent_req *req = NULL;
+ struct smbd_smb2_create_state *state = NULL;
+ NTSTATUS status;
+ struct smb_request *smb1req = NULL;
+ struct smb_filename *smb_fname = NULL;
+ uint32_t ucf_flags;
+
+ req = tevent_req_create(mem_ctx, &state,
+ struct smbd_smb2_create_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ *state = (struct smbd_smb2_create_state) {
+ .ev = ev,
+ .smb2req = smb2req,
+ .in_oplock_level = in_oplock_level,
+ .in_create_disposition = in_create_disposition,
+ };
+
+ smb1req = smbd_smb2_fake_smb_request(smb2req);
+ if (tevent_req_nomem(smb1req, req)) {
+ return tevent_req_post(req, state->ev);
+ }
+ state->smb1req = smb1req;
+
+ if (smb2req->subreq == NULL) {
+ DBG_DEBUG("name [%s]\n", in_name);
+ } else {
+ struct smbd_smb2_create_state *old_state = tevent_req_data(
+ smb2req->subreq, struct smbd_smb2_create_state);
+
+ DBG_DEBUG("reentrant for file %s\n", in_name);
+
+ state->id = old_state->id;
+ state->request_time = old_state->request_time;
+ state->open_rec = talloc_move(state, &old_state->open_rec);
+ state->open_was_deferred = old_state->open_was_deferred;
+ }
+
+ TALLOC_FREE(smb2req->subreq);
+ smb2req->subreq = req;
+
+ if (lp_fake_oplocks(SNUM(smb2req->tcon->compat))) {
+ state->requested_oplock_level = SMB2_OPLOCK_LEVEL_NONE;
+ } else {
+ state->requested_oplock_level = state->in_oplock_level;
+ }
+
+ /* these are ignored for SMB2 */
+ in_create_options &= ~(0x10);/* NTCREATEX_OPTIONS_SYNC_ALERT */
+ in_create_options &= ~(0x20);/* NTCREATEX_OPTIONS_ASYNC_ALERT */
+
+ in_file_attributes &= ~FILE_FLAG_POSIX_SEMANTICS;
+
+ state->fname = talloc_strdup(state, in_name);
+ if (tevent_req_nomem(state->fname, req)) {
+ return tevent_req_post(req, state->ev);
+ }
+
+ state->out_context_blobs = talloc_zero(state, struct smb2_create_blobs);
+ if (tevent_req_nomem(state->out_context_blobs, req)) {
+ return tevent_req_post(req, state->ev);
+ }
+
+ status = smbd_smb2_create_fetch_create_ctx(req, &in_context_blobs);
+ if (tevent_req_nterror(req, status)) {
+ return tevent_req_post(req, state->ev);
+ }
+
if (IS_IPC(smb1req->conn)) {
const char *pipe_name = in_name;
- if (dhnc || dh2c) {
+ if (state->dhnc != NULL || state->dh2c != NULL) {
/* durable handles are not supported on IPC$ */
tevent_req_nterror(req, NT_STATUS_OBJECT_NAME_NOT_FOUND);
- return tevent_req_post(req, ev);
+ return tevent_req_post(req, state->ev);
}
if (!lp_nt_pipe_support()) {
tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
- return tevent_req_post(req, ev);
+ return tevent_req_post(req, state->ev);
}
- status = open_np_file(smb1req, pipe_name, &result);
+ status = open_np_file(smb1req, pipe_name, &state->result);
if (!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
+ return tevent_req_post(req, state->ev);
}
- info = FILE_WAS_OPENED;
+ state->info = FILE_WAS_OPENED;
+
+ smbd_smb2_create_finish(req);
+ return req;
+
} else if (CAN_PRINT(smb1req->conn)) {
- if (dhnc || dh2c) {
+ if (state->dhnc != NULL || state->dh2c != NULL) {
/* durable handles are not supported on printers */
tevent_req_nterror(req, NT_STATUS_OBJECT_NAME_NOT_FOUND);
- return tevent_req_post(req, ev);
+ return tevent_req_post(req, state->ev);
}
- status = file_new(smb1req, smb1req->conn, &result);
+ status = file_new(smb1req, smb1req->conn, &state->result);
if(!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
+ return tevent_req_post(req, state->ev);
}
- status = print_spool_open(result, in_name,
+ status = print_spool_open(state->result, in_name,
smb1req->vuid);
if (!NT_STATUS_IS_OK(status)) {
- file_free(smb1req, result);
+ file_free(smb1req, state->result);
tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
+ return tevent_req_post(req, state->ev);
}
- info = FILE_WAS_CREATED;
- } else {
- char *fname;
- struct smb2_create_blob *exta = NULL;
- struct ea_list *ea_list = NULL;
- struct smb2_create_blob *mxac = NULL;
- NTTIME max_access_time = 0;
- struct smb2_create_blob *secd = NULL;
- struct security_descriptor *sec_desc = NULL;
- struct smb2_create_blob *alsi = NULL;
- uint64_t allocation_size = 0;
- struct smb2_create_blob *twrp = NULL;
- struct smb2_create_blob *qfid = NULL;
- struct GUID _create_guid = GUID_zero();
- struct GUID *create_guid = NULL;
- bool update_open = false;
- bool durable_requested = false;
- uint32_t durable_timeout_msec = 0;
- bool do_durable_reconnect = false;
- uint64_t persistent_id = 0;
- struct smb2_lease lease;
- struct smb2_lease *lease_ptr = NULL;
- ssize_t lease_len = -1;
- bool need_replay_cache = false;
- struct smbXsrv_open *op = NULL;
-#if 0
- struct smb2_create_blob *svhdx = NULL;
-#endif
-
- exta = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_EXTA);
- mxac = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_MXAC);
- secd = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_SECD);
- alsi = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_ALSI);
- twrp = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_TWRP);
- qfid = smb2_create_blob_find(&in_context_blobs,
- SMB2_CREATE_TAG_QFID);
-#if 0
- if (smb2req->xconn->protocol >= PROTOCOL_SMB3_02) {
- /*
- * This was introduced with SMB3_02
- */
- svhdx = smb2_create_blob_find(&in_context_blobs,
- SVHDX_OPEN_DEVICE_CONTEXT);
+ state->info = FILE_WAS_CREATED;
+
+ smbd_smb2_create_finish(req);
+ return req;
+ }
+
+ smbd_smb2_create_before_exec(req);
+ if (!tevent_req_is_in_progress(req)) {
+ return tevent_req_post(req, state->ev);
+ }
+
+ DBG_DEBUG("open execution phase\n");
+
+ /*
+ * For the backend file open procedure, there are
+ * three possible modes: replay operation (in which case
+ * there is nothing else to do), durable_reconnect or
+ * new open.
+ */
+ if (state->replay_operation) {
+ state->result = state->op->compat;
+ state->result->op = state->op;
+ state->update_open = false;
+ state->info = state->op->create_action;
+
+ smbd_smb2_create_after_exec(req);
+ if (!tevent_req_is_in_progress(req)) {
+ return req;
}
-#endif
- fname = talloc_strdup(state, in_name);
- if (tevent_req_nomem(fname, req)) {
- return tevent_req_post(req, ev);
+ smbd_smb2_create_finish(req);
+ return req;
+
+ } else if (state->do_durable_reconnect) {
+ DATA_BLOB new_cookie = data_blob_null;
+ NTTIME now = timeval_to_nttime(&smb2req->request_time);
+
+ status = smb2srv_open_recreate(smb2req->xconn,
+ smb1req->conn->session_info,
+ state->persistent_id,
+ state->create_guid,
+ now,
--
Samba Shared Repository
More information about the samba-cvs
mailing list