s3:libsmb: add support for SMB2/3 in cli_chkpath()
authorStefan Metzmacher <metze@samba.org>
Wed, 16 Aug 2017 05:18:02 +0000 (07:18 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Feb 2019 11:44:35 +0000 (12:44 +0100)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12968

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source3/libsmb/cli_smb2_fnum.c
source3/libsmb/cli_smb2_fnum.h
source3/libsmb/clifile.c

index e7b89a44e58ea2eea9f96a8586b25ddde9ab44d0..b50f32855e4a1769fe080cae5413b658a287dadd 100644 (file)
@@ -589,6 +589,44 @@ NTSTATUS cli_smb2_delete_on_close_recv(struct tevent_req *req)
        return NT_STATUS_OK;
 }
 
+/***************************************************************
+ Small wrapper that allows SMB2 to check for a directory
+ Synchronous only.
+***************************************************************/
+
+NTSTATUS cli_smb2_chkpath(struct cli_state *cli, const char *dname)
+{
+       NTSTATUS status;
+       uint16_t fnum;
+
+       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;
+       }
+
+       status = cli_smb2_create_fnum(cli,
+                       dname,
+                       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);
+}
+
 NTSTATUS cli_smb2_delete_on_close(struct cli_state *cli, uint16_t fnum, bool flag)
 {
        TALLOC_CTX *frame = talloc_stackframe();
index 921dc71d9ebaf07a42d0797dcaee1e6946071c75..ebd18dddb5245962cef38323218d6ae003175ca5 100644 (file)
@@ -63,6 +63,7 @@ struct tevent_req *cli_smb2_delete_on_close_send(TALLOC_CTX *mem_ctx,
                                        bool flag);
 NTSTATUS cli_smb2_delete_on_close_recv(struct tevent_req *req);
 NTSTATUS cli_smb2_delete_on_close(struct cli_state *cli, uint16_t fnum, bool flag);
+NTSTATUS cli_smb2_chkpath(struct cli_state *cli, const char *dname);
 NTSTATUS cli_smb2_mkdir(struct cli_state *cli, const char *dirname);
 NTSTATUS cli_smb2_rmdir(struct cli_state *cli, const char *dirname);
 NTSTATUS cli_smb2_unlink(struct cli_state *cli,const char *fname);
index 6defa38fdee3e9e0949097452638c4f1b9db7c35..01206ede6528591eba2ac8a69954869bd3d6d5c8 100644 (file)
@@ -4307,6 +4307,12 @@ NTSTATUS cli_chkpath(struct cli_state *cli, const char *path)
                }
        }
 
+       if (smbXcli_conn_protocol(cli->conn) >= PROTOCOL_SMB2_02) {
+               status = cli_smb2_chkpath(cli, path2);
+               TALLOC_FREE(frame);
+               return status;
+       }
+
        ev = samba_tevent_context_init(frame);
        if (ev == NULL) {
                status = NT_STATUS_NO_MEMORY;