[PATCH] Fix bug 12968 - smbclient tarmode doesn't work with SMB2/3.

Stefan Metzmacher metze at samba.org
Wed Aug 16 22:56:52 UTC 2017


Hi Jeremy,

> As Metze points out in the bug report, cli_chkpath()
> is missing an SMB2 implementation.
> 
> Please review and push if happy !

I had the following version for this...

I don't care which one we take, please push one of it.

Thanks!
metze

-------------- next part --------------
From 3a9154cc49f89249e3bf06af236a642a27ba8ed1 Mon Sep 17 00:00:00 2001
From: Stefan Metzmacher <metze at samba.org>
Date: Wed, 16 Aug 2017 07:18:02 +0200
Subject: [PATCH] s3:libsmb: add support for SMB2/3 in cli_chkpath()

BUG: https://bugzilla.samba.org/show_bug.cgi?id=12968

Signed-off-by: Stefan Metzmacher <metze at samba.org>
---
 source3/libsmb/cli_smb2_fnum.c | 38 ++++++++++++++++++++++++++++++++++++++
 source3/libsmb/cli_smb2_fnum.h |  1 +
 source3/libsmb/clifile.c       |  6 ++++++
 3 files changed, 45 insertions(+)

diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c
index 2d2667e..d3782c5 100644
--- a/source3/libsmb/cli_smb2_fnum.c
+++ b/source3/libsmb/cli_smb2_fnum.c
@@ -581,6 +581,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();
diff --git a/source3/libsmb/cli_smb2_fnum.h b/source3/libsmb/cli_smb2_fnum.h
index 402801b..a0a9fd8 100644
--- a/source3/libsmb/cli_smb2_fnum.h
+++ b/source3/libsmb/cli_smb2_fnum.h
@@ -61,6 +61,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);
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index 828448f..fefedbb 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -4261,6 +4261,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;
-- 
1.9.1

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20170817/127e6090/signature.sig>


More information about the samba-technical mailing list