From 428fc22e8bb7b7a74ba9e29bf962ebfbfd50c47b Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 16 Aug 2017 15:48:01 -0700 Subject: [PATCH] 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 --- 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 2d2667e4bb3..b8179b0a48c 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 402801bd18a..a6c36275eb8 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 828448f2d5a..a6a0bafa2cd 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.34.1