From aa8773146c3df4434378f568cbd175f2828cc7ac Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 16 Aug 2017 15:48:01 -0700 Subject: [PATCH 1/2] s3: libsmb: Add cli_smb2_chkpath() and use from cli_chkpath(). BUG: https://bugzilla.samba.org/show_bug.cgi?id=12968 Signed-off-by: Jeremy Allison Reviewed-by: Stefan Metzmacher (cherry picked from commit 428fc22e8bb7b7a74ba9e29bf962ebfbfd50c47b) --- source3/libsmb/cli_smb2_fnum.c | 41 +++++++++++++++++++++++++++++++++++++++++ source3/libsmb/cli_smb2_fnum.h | 2 ++ source3/libsmb/clifile.c | 8 +++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index 8ee97cad276..a478c41f068 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -1100,6 +1100,47 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli, return status; } +/*************************************************************** + Wrapper that allows SMB2 to check if a path is a directory. + Synchronous only. +***************************************************************/ + +NTSTATUS cli_smb2_chkpath(struct cli_state *cli, + const char *name) +{ + NTSTATUS status; + uint16_t fnum = 0xffff; + + if (smbXcli_conn_has_async_calls(cli->conn)) { + /* + * Can't use sync call while an async call is in flight + */ + return NT_STATUS_INVALID_PARAMETER; + } + + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + return NT_STATUS_INVALID_PARAMETER; + } + + /* Ensure this is a directory. */ + status = cli_smb2_create_fnum(cli, + name, + 0, /* create_flags */ + FILE_READ_ATTRIBUTES, /* desired_access */ + FILE_ATTRIBUTE_DIRECTORY, /* file attributes */ + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, /* share_access */ + FILE_OPEN, /* create_disposition */ + FILE_DIRECTORY_FILE, /* create_options */ + &fnum, + NULL); + + if (!NT_STATUS_IS_OK(status)) { + return status; + } + + return cli_smb2_close_fnum(cli, fnum); +} + /*************************************************************** Helper function for pathname operations. ***************************************************************/ diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h index 8e240c6bc5b..9a709e85d96 100644 --- a/source3/libsmb/cli_smb2_fnum.h +++ b/source3/libsmb/cli_smb2_fnum.h @@ -79,6 +79,8 @@ NTSTATUS cli_smb2_qpathinfo_basic(struct cli_state *cli, NTSTATUS cli_smb2_qpathinfo_alt_name(struct cli_state *cli, const char *name, fstring alt_name); +NTSTATUS cli_smb2_chkpath(struct cli_state *cli, + const char *name); NTSTATUS cli_smb2_qfileinfo_basic(struct cli_state *cli, uint16_t fnum, uint16_t *mode, diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 1455fbdbdfd..c3ca2995087 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -4233,12 +4233,18 @@ NTSTATUS cli_chkpath_recv(struct tevent_req *req) NTSTATUS cli_chkpath(struct cli_state *cli, const char *path) { - TALLOC_CTX *frame = talloc_stackframe(); + TALLOC_CTX *frame = NULL; struct tevent_context *ev = NULL; struct tevent_req *req = NULL; char *path2 = NULL; NTSTATUS status = NT_STATUS_OK; + if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) { + return cli_smb2_chkpath(cli, path); + } + + frame = talloc_stackframe(); + if (smbXcli_conn_has_async_calls(cli->conn)) { /* * Can't use sync call while an async call is in flight -- 2.14.1.480.gb18f417b89-goog From 5d0c2c7dced82498bf729a7b994fe3c876217b02 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 16 Aug 2017 22:27:15 +0200 Subject: [PATCH 2/2] libcli/smb: debug an error if smb1cli_req_writev_submit() is called for SMB2/3 BUG: https://bugzilla.samba.org/show_bug.cgi?id=12968 Signed-off-by: Stefan Metzmacher Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Fri Aug 18 04:45:03 CEST 2017 on sn-devel-144 (cherry picked from commit 9fb2562324e4381f8d0d5eaf864790ad770293b9) --- libcli/smb/smbXcli_base.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index cc8978975e1..d73949b90d7 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -1661,6 +1661,9 @@ static NTSTATUS smb1cli_req_writev_submit(struct tevent_req *req, } if (state->conn->protocol > PROTOCOL_NT1) { + DBG_ERR("called for dialect[%s] server[%s]\n", + smb_protocol_types_string(state->conn->protocol), + smbXcli_conn_remote_name(state->conn)); return NT_STATUS_REVISION_MISMATCH; } -- 2.14.1.480.gb18f417b89-goog