[SCM] Samba Shared Repository - branch master updated

Uri Simchoni uri at samba.org
Fri Aug 19 22:00:03 UTC 2016


The branch, master has been updated
       via  57a54af s3: smbclient: In order to get shadow copy data over SMB1 we must call cli_shadow_copy_data() twice.
       via  336da63 s3: libsmb: Do some hardening in the receive processing of cli_shadow_copy_data_recv().
       via  a9fe27e s3: libsmb: Correctly set max_setup_size in FSCTL_GET_SHADOW_COPY_DATA nttrans ioctl.
       via  0b252d7 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_list_trans_send().
       via  e4a261c s3: libsmb: Make a comment note that cli_set_ea() needs some internal changes before cli_set_ea_path() can use previous path versions.
       via  97cde5d s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_ctemp_send().
       via  e2d7055 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_chkpath_send().
       via  00551d7 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_setatr_send().
       via  461000c s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_getatr_send().
       via  47c1314 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_openx_create().
       via  d7ee917 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_nttrans_create_send().
       via  cd4a60b s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_ntcreate1_send().
       via  17d1f19 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_rmdir_send()
       via  3081604 s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_mkdir_send().
       via  3242a0b s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_unlink_send().
       via  c2a1905 s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_ntrename_internal_send().
       via  ae70479 s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_rename_send().
       via  21a7bf4 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_qpathinfo_send()
       via  75e4290 s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_setpathinfo_send().
       via  19696f3 s3: libsmb: Add clistr_is_previous_version_path()
       via  79c8b75 s3: libsmb: Add uint16_t addtional_flags2 to cli_smb_req_create().
       via  76bbc4c s3: libsmb: Add uint16_t addtional_flags2 to cli_trans_send().
       via  a876f91 s3: libsmb: Add uint16_t additional_flags2 arg to cli_smb_send().
       via  66650e6 s3: SMB1: Add missing FLAGS2 definitions from MS-SMB.
      from  3c103f9 netcmd/domain: improve error message grammar

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 57a54af66f414708d5c02f346f08bc4bfd55349d
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:36:50 2016 -0700

    s3: smbclient: In order to get shadow copy data over SMB1 we must call cli_shadow_copy_data() twice.
    
    Once with 'get_names = false' to get the size, then again with 'get_names = true'
    to get the data or a Windows server fails to return valid info. Samba doesn't have this bug.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>
    
    Autobuild-User(master): Uri Simchoni <uri at samba.org>
    Autobuild-Date(master): Fri Aug 19 23:59:35 CEST 2016 on sn-devel-144

commit 336da637541fba13586af6fc2cb9d143d656e87e
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 12:06:23 2016 -0700

    s3: libsmb: Do some hardening in the receive processing of cli_shadow_copy_data_recv().
    
    Protect against malicious servers.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit a9fe27e17ce55461946037bb25a432da340095ab
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:33:01 2016 -0700

    s3: libsmb: Correctly set max_setup_size in FSCTL_GET_SHADOW_COPY_DATA nttrans ioctl.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 0b252d7c6fdd963308fff8938a8be185892afbbe
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:26:20 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_list_trans_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit e4a261c6c826a2be75bcd9d6af8232f043acc5f1
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:20:11 2016 -0700

    s3: libsmb: Make a comment note that cli_set_ea() needs some internal changes before cli_set_ea_path() can use previous path versions.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 97cde5dc92185f188868ddd71287d43ddae30516
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:07:17 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_ctemp_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit e2d70551e1ba13119d53afaa00f05e70897484f0
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:05:33 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_chkpath_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 00551d73063b46d3dd2740951a2a8f1b2e351f79
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:04:05 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_setatr_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 461000c8812a99a81a9f3fc87f93c1b7c67f42bd
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 14:02:24 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_getatr_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 47c1314429cdf516358d5e00ca24c313ddab67b0
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:59:52 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_openx_create().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit d7ee917b165da2695433b7b115363223f2bd214f
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:40:23 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_nttrans_create_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit cd4a60bb1f84891763617f96de148068e0492773
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:37:22 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_ntcreate1_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 17d1f19eda2c735fcb10a389c3681ccd385bb9c7
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:34:44 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_rmdir_send()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 3081604734a9531cefa71d0417a6fbfee9a6a8b6
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:33:30 2016 -0700

    s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_mkdir_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 3242a0b9f0ae0d51110dc6542195af1be91aeece
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:32:03 2016 -0700

    s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_unlink_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit c2a1905abd5d8756dd4afdd3116d311b1dec1246
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:29:01 2016 -0700

    s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_ntrename_internal_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit ae7047923e756d7ee1d760b7495560c25c71b523
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:26:59 2016 -0700

    s3: libsmb: s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_rename_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 21a7bf428bb8ed5b5634b87896bf0aa6c095d7f6
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:17:49 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_qpathinfo_send()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 75e4290b6055cf95fc4730c4fa431bcc91eed203
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:12:22 2016 -0700

    s3: libsmb: Plumb in additional_flags2 = FLAGS2_REPARSE_PATH to cli_setpathinfo_send().
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 19696f3494bd944ac9226aeebebb7a00df6f53b4
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:06:54 2016 -0700

    s3: libsmb: Add clistr_is_previous_version_path()
    
    Looks for @GMT- token in pathname.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 79c8b756715d021f12474a12eca1efb596f92a84
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 13:45:35 2016 -0700

    s3: libsmb: Add uint16_t addtional_flags2 to cli_smb_req_create().
    
    Not yet used.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 76bbc4c0c338a021e10f3d2de2f6c58b4ee81169
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 12:45:32 2016 -0700

    s3: libsmb: Add uint16_t addtional_flags2 to cli_trans_send().
    
    Not yet used.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit a876f915fd2cddc96e6044c0a73c87153445baf6
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Aug 18 12:20:25 2016 -0700

    s3: libsmb: Add uint16_t additional_flags2 arg to cli_smb_send().
    
    Not yet used.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 66650e67698ed2ed2c1e604343d4209e84f58032
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Aug 17 14:33:00 2016 -0700

    s3: SMB1: Add missing FLAGS2 definitions from MS-SMB.
    
    https://bugzilla.samba.org/show_bug.cgi?id=12165
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 libcli/smb/smb_constants.h    |   2 +
 source3/client/client.c       |  14 ++++
 source3/include/async_smb.h   |   5 +-
 source3/libsmb/async_smb.c    |   4 +-
 source3/libsmb/cliconnect.c   |  20 ++---
 source3/libsmb/clientgen.c    |   2 +-
 source3/libsmb/clifile.c      | 181 +++++++++++++++++++++++++++++++++++-------
 source3/libsmb/clifsinfo.c    |   7 +-
 source3/libsmb/clilist.c      |  21 +++--
 source3/libsmb/climessage.c   |   6 +-
 source3/libsmb/clioplock.c    |   2 +-
 source3/libsmb/clireadwrite.c |   4 +-
 source3/libsmb/clistr.c       |  28 +++++++
 source3/libsmb/clisymlink.c   |   4 +-
 source3/libsmb/clitrans.c     |   3 +-
 source3/libsmb/proto.h        |   3 +-
 16 files changed, 246 insertions(+), 60 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/smb/smb_constants.h b/libcli/smb/smb_constants.h
index e03e843..2fcb590 100644
--- a/libcli/smb/smb_constants.h
+++ b/libcli/smb/smb_constants.h
@@ -309,8 +309,10 @@ enum csc_policy {
 #define FLAGS2_LONG_PATH_COMPONENTS    0x0001
 #define FLAGS2_EXTENDED_ATTRIBUTES     0x0002
 #define FLAGS2_SMB_SECURITY_SIGNATURES 0x0004
+#define FLAGS2_COMPRESSED              0x0008 /* MS-SMB */
 #define FLAGS2_SMB_SECURITY_SIGNATURES_REQUIRED 0x0010
 #define FLAGS2_IS_LONG_NAME            0x0040
+#define FLAGS2_REPARSE_PATH            0x0400 /* MS-SMB @GMT- path. */
 #define FLAGS2_EXTENDED_SECURITY       0x0800
 #define FLAGS2_DFS_PATHNAMES           0x1000
 #define FLAGS2_READ_PERMIT_EXECUTE     0x2000
diff --git a/source3/client/client.c b/source3/client/client.c
index 45dc11c..7fbfdf0 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -1782,6 +1782,20 @@ static int do_allinfo(const char *name)
 		 */
 		return 0;
 	}
+	/*
+	 * In order to get shadow copy data over SMB1 we
+	 * must call twice, once with 'get_names = false'
+	 * to get the size, then again with 'get_names = true'
+	 * to get the data or a Windows server fails to return
+	 * valid info. Samba doesn't have this bug. JRA.
+	 */
+
+	status = cli_shadow_copy_data(talloc_tos(), cli, fnum,
+				      false, &snapshots, &num_snapshots);
+	if (!NT_STATUS_IS_OK(status)) {
+		cli_close(cli, fnum);
+		return 0;
+	}
 	status = cli_shadow_copy_data(talloc_tos(), cli, fnum,
 				      true, &snapshots, &num_snapshots);
 	if (!NT_STATUS_IS_OK(status)) {
diff --git a/source3/include/async_smb.h b/source3/include/async_smb.h
index 00c2313..3c64d08 100644
--- a/source3/include/async_smb.h
+++ b/source3/include/async_smb.h
@@ -27,12 +27,15 @@ struct tevent_req *cli_smb_req_create(TALLOC_CTX *mem_ctx,
 				      struct cli_state *cli,
 				      uint8_t smb_command,
 				      uint8_t additional_flags,
+				      uint16_t additional_flags2,
 				      uint8_t wct, uint16_t *vwv,
 				      int iov_count,
 				      struct iovec *bytes_iov);
 struct tevent_req *cli_smb_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 				struct cli_state *cli,
-				uint8_t smb_command, uint8_t additional_flags,
+				uint8_t smb_command,
+				uint8_t additional_flags,
+				uint16_t additional_flags2,
 				uint8_t wct, uint16_t *vwv,
 				uint32_t num_bytes,
 				const uint8_t *bytes);
diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c
index 8d5c3d4..bcb24a4 100644
--- a/source3/libsmb/async_smb.c
+++ b/source3/libsmb/async_smb.c
@@ -54,13 +54,13 @@ struct tevent_req *cli_smb_req_create(TALLOC_CTX *mem_ctx,
 				      struct cli_state *cli,
 				      uint8_t smb_command,
 				      uint8_t additional_flags,
+				      uint16_t additional_flags2,
 				      uint8_t wct, uint16_t *vwv,
 				      int iov_count,
 				      struct iovec *bytes_iov)
 {
 	struct cli_smb_req_state *state;
 	uint8_t clear_flags = 0;
-	uint16_t additional_flags2 = 0;
 	uint16_t clear_flags2 = 0;
 
 	state = talloc_zero(mem_ctx, struct cli_smb_req_state);
@@ -101,13 +101,13 @@ struct tevent_req *cli_smb_send(TALLOC_CTX *mem_ctx,
 				struct cli_state *cli,
 				uint8_t smb_command,
 				uint8_t additional_flags,
+				uint16_t additional_flags2,
 				uint8_t wct, uint16_t *vwv,
 				uint32_t num_bytes,
 				const uint8_t *bytes)
 {
 	struct cli_smb_req_state *state;
 	uint8_t clear_flags = 0;
-	uint16_t additional_flags2 = 0;
 	uint16_t clear_flags2 = 0;
 
 	state = talloc_zero(mem_ctx, struct cli_smb_req_state);
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index 33759d9..9c8851f 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -204,7 +204,7 @@ static struct tevent_req *cli_session_setup_lanman2_send(
 		return tevent_req_post(req, ev);
 	}
 
-	subreq = cli_smb_send(state, ev, cli, SMBsesssetupX, 0, 10, vwv,
+	subreq = cli_smb_send(state, ev, cli, SMBsesssetupX, 0, 0, 10, vwv,
 			      talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -386,8 +386,8 @@ struct tevent_req *cli_session_setup_guest_create(TALLOC_CTX *mem_ctx,
 	state->bytes.iov_base = (void *)bytes;
 	state->bytes.iov_len = talloc_get_size(bytes);
 
-	subreq = cli_smb_req_create(state, ev, cli, SMBsesssetupX, 0, 13, vwv,
-				    1, &state->bytes);
+	subreq = cli_smb_req_create(state, ev, cli, SMBsesssetupX, 0, 0, 13,
+			vwv, 1, &state->bytes);
 	if (subreq == NULL) {
 		TALLOC_FREE(req);
 		return NULL;
@@ -569,7 +569,7 @@ static struct tevent_req *cli_session_setup_plain_send(
 		return tevent_req_post(req, ev);
 	}
 
-	subreq = cli_smb_send(state, ev, cli, SMBsesssetupX, 0, 13, vwv,
+	subreq = cli_smb_send(state, ev, cli, SMBsesssetupX, 0, 0, 13, vwv,
 			      talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -880,7 +880,7 @@ static struct tevent_req *cli_session_setup_nt1_send(
 		return tevent_req_post(req, ev);
 	}
 
-	subreq = cli_smb_send(state, ev, cli, SMBsesssetupX, 0, 13, vwv,
+	subreq = cli_smb_send(state, ev, cli, SMBsesssetupX, 0, 0, 13, vwv,
 			      talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -1111,7 +1111,7 @@ static bool cli_sesssetup_blob_next(struct cli_sesssetup_blob_state *state,
 	if (state->buf == NULL) {
 		return false;
 	}
-	subreq = cli_smb_send(state, state->ev, state->cli, SMBsesssetupX, 0,
+	subreq = cli_smb_send(state, state->ev, state->cli, SMBsesssetupX, 0, 0,
 			      12, state->vwv,
 			      talloc_get_size(state->buf), state->buf);
 	if (subreq == NULL) {
@@ -2331,7 +2331,7 @@ static struct tevent_req *cli_ulogoff_send(TALLOC_CTX *mem_ctx,
 	SCVAL(state->vwv+1, 0, 0);
 	SSVAL(state->vwv+2, 0, 0);
 
-	subreq = cli_smb_send(state, ev, cli, SMBulogoffX, 0, 2, state->vwv,
+	subreq = cli_smb_send(state, ev, cli, SMBulogoffX, 0, 0, 2, state->vwv,
 			      0, NULL);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -2549,7 +2549,7 @@ struct tevent_req *cli_tcon_andx_create(TALLOC_CTX *mem_ctx,
 	state->bytes.iov_base = (void *)bytes;
 	state->bytes.iov_len = talloc_get_size(bytes);
 
-	subreq = cli_smb_req_create(state, ev, cli, SMBtconX, 0, 4, vwv,
+	subreq = cli_smb_req_create(state, ev, cli, SMBtconX, 0, 0, 4, vwv,
 				    1, &state->bytes);
 	if (subreq == NULL) {
 		TALLOC_FREE(req);
@@ -2877,7 +2877,7 @@ static struct tevent_req *cli_tdis_send(TALLOC_CTX *mem_ctx,
 	}
 	state->cli = cli;
 
-	subreq = cli_smb_send(state, ev, cli, SMBtdis, 0, 0, NULL, 0, NULL);
+	subreq = cli_smb_send(state, ev, cli, SMBtdis, 0, 0, 0, NULL, 0, NULL);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -3594,7 +3594,7 @@ static struct tevent_req *cli_raw_tcon_send(
 		return tevent_req_post(req, ev);
 	}
 
-	subreq = cli_smb_send(state, ev, cli, SMBtcon, 0, 0, NULL,
+	subreq = cli_smb_send(state, ev, cli, SMBtcon, 0, 0, 0, NULL,
 			      talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index bf31bb1..bc5c1b1 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -592,7 +592,7 @@ NTSTATUS cli_smb(TALLOC_CTX *mem_ctx, struct cli_state *cli,
         if (ev == NULL) {
                 goto fail;
         }
-        req = cli_smb_send(mem_ctx, ev, cli, smb_command, additional_flags,
+        req = cli_smb_send(mem_ctx, ev, cli, smb_command, additional_flags, 0,
 			   wct, vwv, num_bytes, bytes);
         if (req == NULL) {
                 goto fail;
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index 684f263..0964b3a 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -173,6 +173,7 @@ struct tevent_req *cli_setpathinfo_send(TALLOC_CTX *mem_ctx,
 {
 	struct tevent_req *req, *subreq;
 	struct cli_setpathinfo_state *state;
+	uint16_t additional_flags2 = 0;
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct cli_setpathinfo_state);
@@ -196,10 +197,16 @@ struct tevent_req *cli_setpathinfo_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(path) &&
+			!INFO_LEVEL_IS_UNIX(level)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	subreq = cli_trans_send(
 		state,			/* mem ctx. */
 		ev,			/* event ctx. */
 		cli,			/* cli_state. */
+		additional_flags2,	/* additional_flags2 */
 		SMBtrans2,		/* cmd. */
 		NULL,			/* pipe name. */
 		-1,			/* fid. */
@@ -1127,6 +1134,7 @@ struct tevent_req *cli_rename_send(TALLOC_CTX *mem_ctx,
 	struct tevent_req *req = NULL, *subreq = NULL;
 	struct cli_rename_state *state = NULL;
 	uint8_t additional_flags = 0;
+	uint16_t additional_flags2 = 0;
 	uint8_t *bytes = NULL;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_rename_state);
@@ -1147,6 +1155,10 @@ struct tevent_req *cli_rename_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(fname_src)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	bytes = talloc_realloc(state, bytes, uint8_t,
 			talloc_get_size(bytes)+1);
 	if (tevent_req_nomem(bytes, req)) {
@@ -1161,7 +1173,8 @@ struct tevent_req *cli_rename_send(TALLOC_CTX *mem_ctx,
 	}
 
 	subreq = cli_smb_send(state, ev, cli, SMBmv, additional_flags,
-			      1, state->vwv, talloc_get_size(bytes), bytes);
+			additional_flags2,
+			1, state->vwv, talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -1254,6 +1267,7 @@ static struct tevent_req *cli_ntrename_internal_send(TALLOC_CTX *mem_ctx,
 	struct tevent_req *req = NULL, *subreq = NULL;
 	struct cli_ntrename_internal_state *state = NULL;
 	uint8_t additional_flags = 0;
+	uint16_t additional_flags2 = 0;
 	uint8_t *bytes = NULL;
 
 	req = tevent_req_create(mem_ctx, &state,
@@ -1276,6 +1290,10 @@ static struct tevent_req *cli_ntrename_internal_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(fname_src)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	bytes = talloc_realloc(state, bytes, uint8_t,
 			talloc_get_size(bytes)+1);
 	if (tevent_req_nomem(bytes, req)) {
@@ -1290,7 +1308,8 @@ static struct tevent_req *cli_ntrename_internal_send(TALLOC_CTX *mem_ctx,
 	}
 
 	subreq = cli_smb_send(state, ev, cli, SMBntrename, additional_flags,
-			      4, state->vwv, talloc_get_size(bytes), bytes);
+			additional_flags2,
+			4, state->vwv, talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -1454,6 +1473,7 @@ struct tevent_req *cli_unlink_send(TALLOC_CTX *mem_ctx,
 	struct tevent_req *req = NULL, *subreq = NULL;
 	struct cli_unlink_state *state = NULL;
 	uint8_t additional_flags = 0;
+	uint16_t additional_flags2 = 0;
 	uint8_t *bytes = NULL;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_unlink_state);
@@ -1475,7 +1495,12 @@ struct tevent_req *cli_unlink_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(fname)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	subreq = cli_smb_send(state, ev, cli, SMBunlink, additional_flags,
+				additional_flags2,
 				1, state->vwv, talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -1565,6 +1590,7 @@ struct tevent_req *cli_mkdir_send(TALLOC_CTX *mem_ctx,
 	struct tevent_req *req = NULL, *subreq = NULL;
 	struct cli_mkdir_state *state = NULL;
 	uint8_t additional_flags = 0;
+	uint16_t additional_flags2 = 0;
 	uint8_t *bytes = NULL;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_mkdir_state);
@@ -1584,8 +1610,13 @@ struct tevent_req *cli_mkdir_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(dname)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	subreq = cli_smb_send(state, ev, cli, SMBmkdir, additional_flags,
-			      0, NULL, talloc_get_size(bytes), bytes);
+			additional_flags2,
+			0, NULL, talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -1674,6 +1705,7 @@ struct tevent_req *cli_rmdir_send(TALLOC_CTX *mem_ctx,
 	struct tevent_req *req = NULL, *subreq = NULL;
 	struct cli_rmdir_state *state = NULL;
 	uint8_t additional_flags = 0;
+	uint16_t additional_flags2 = 0;
 	uint8_t *bytes = NULL;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_rmdir_state);
@@ -1693,8 +1725,13 @@ struct tevent_req *cli_rmdir_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(dname)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	subreq = cli_smb_send(state, ev, cli, SMBrmdir, additional_flags,
-			      0, NULL, talloc_get_size(bytes), bytes);
+			additional_flags2,
+			0, NULL, talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -1809,6 +1846,7 @@ struct tevent_req *cli_nt_delete_on_close_send(TALLOC_CTX *mem_ctx,
 	subreq = cli_trans_send(state,			/* mem ctx. */
 				ev,			/* event ctx. */
 				cli,			/* cli_state. */
+				0,			/* additional_flags2 */
 				SMBtrans2,		/* cmd. */
 				NULL,			/* pipe name. */
 				-1,			/* fid. */
@@ -1905,6 +1943,7 @@ static struct tevent_req *cli_ntcreate1_send(TALLOC_CTX *mem_ctx,
 	uint16_t *vwv;
 	uint8_t *bytes;
 	size_t converted_len;
+	uint16_t additional_flags2 = 0;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_ntcreate1_state);
 	if (req == NULL) {
@@ -1939,6 +1978,10 @@ static struct tevent_req *cli_ntcreate1_send(TALLOC_CTX *mem_ctx,
 				   fname, strlen(fname)+1,
 				   &converted_len);
 
+	if (clistr_is_previous_version_path(fname)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	/* sigh. this copes with broken netapp filer behaviour */
 	bytes = smb_bytes_push_str(bytes, smbXcli_conn_use_unicode(cli->conn), "", 1, NULL);
 
@@ -1948,8 +1991,9 @@ static struct tevent_req *cli_ntcreate1_send(TALLOC_CTX *mem_ctx,
 
 	SSVAL(vwv+2, 1, converted_len);
 
-	subreq = cli_smb_send(state, ev, cli, SMBntcreateX, 0, 24, vwv,
-			      talloc_get_size(bytes), bytes);
+	subreq = cli_smb_send(state, ev, cli, SMBntcreateX, 0,
+			additional_flags2, 24, vwv,
+			talloc_get_size(bytes), bytes);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
@@ -2197,6 +2241,7 @@ struct tevent_req *cli_nttrans_create_send(TALLOC_CTX *mem_ctx,
 	size_t secdesc_len;
 	NTSTATUS status;
 	size_t converted_len;
+	uint16_t additional_flags2 = 0;
 
 	req = tevent_req_create(mem_ctx,
 				&state, struct cli_nttrans_create_state);
@@ -2237,6 +2282,10 @@ struct tevent_req *cli_nttrans_create_send(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(fname)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	SIVAL(param, 0, CreatFlags);
 	SIVAL(param, 4, 0x0);	/* RootDirectoryFid */
 	SIVAL(param, 8, DesiredAccess);
@@ -2253,7 +2302,9 @@ struct tevent_req *cli_nttrans_create_send(TALLOC_CTX *mem_ctx,
 	SIVAL(param, 48, 0x02); /* ImpersonationLevel */
 	SCVAL(param, 52, SecurityFlags);
 
-	subreq = cli_trans_send(state, ev, cli, SMBnttrans,
+	subreq = cli_trans_send(state, ev, cli,
+				additional_flags2, /* additional_flags2 */
+				SMBnttrans,
 				NULL, -1, /* name, fid */
 				NT_TRANSACT_CREATE, 0,
 				NULL, 0, 0, /* setup */
@@ -2389,6 +2440,7 @@ struct tevent_req *cli_openx_create(TALLOC_CTX *mem_ctx,
 	unsigned openfn;
 	unsigned accessmode;
 	uint8_t additional_flags;
+	uint16_t additional_flags2 = 0;
 	uint8_t *bytes;
 
 	req = tevent_req_create(mem_ctx, &state, struct cli_openx_state);
@@ -2456,11 +2508,15 @@ struct tevent_req *cli_openx_create(TALLOC_CTX *mem_ctx,
 		return tevent_req_post(req, ev);
 	}
 
+	if (clistr_is_previous_version_path(fname)) {
+		additional_flags2 = FLAGS2_REPARSE_PATH;
+	}
+
 	state->bytes.iov_base = (void *)bytes;
 	state->bytes.iov_len = talloc_get_size(bytes);
 
 	subreq = cli_smb_req_create(state, ev, cli, SMBopenX, additional_flags,
-				    15, state->vwv, 1, &state->bytes);
+			additional_flags2, 15, state->vwv, 1, &state->bytes);
 	if (subreq == NULL) {
 		TALLOC_FREE(req);
 		return NULL;
@@ -2722,8 +2778,8 @@ struct tevent_req *cli_close_create(TALLOC_CTX *mem_ctx,
 	SSVAL(state->vwv+0, 0, fnum);
 	SIVALS(state->vwv+1, 0, -1);
 
-	subreq = cli_smb_req_create(state, ev, cli, SMBclose, 0, 3, state->vwv,
-				    0, NULL);
+	subreq = cli_smb_req_create(state, ev, cli, SMBclose, 0, 0,
+				3, state->vwv, 0, NULL);
 	if (subreq == NULL) {
 		TALLOC_FREE(req);
 		return NULL;
@@ -2860,6 +2916,7 @@ struct tevent_req *cli_ftruncate_send(TALLOC_CTX *mem_ctx,
 	subreq = cli_trans_send(state,			/* mem ctx. */
 				ev,			/* event ctx. */
 				cli,			/* cli_state. */
+				0,			/* additional_flags2 */
 				SMBtrans2,		/* cmd. */
 				NULL,			/* pipe name. */
 				-1,			/* fid. */
@@ -3032,7 +3089,7 @@ struct tevent_req *cli_unlock_send(TALLOC_CTX *mem_ctx,
 	SIVAL(state->data, 2, offset);
 	SIVAL(state->data, 6, len);
 
-	subreq = cli_smb_send(state, ev, cli, SMBlockingX, additional_flags,
+	subreq = cli_smb_send(state, ev, cli, SMBlockingX, additional_flags, 0,
 				8, state->vwv, 10, state->data);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -3196,7 +3253,7 @@ struct tevent_req *cli_unlock64_send(TALLOC_CTX *mem_ctx,
 	SOFF_T_R(state->data, 4, offset);
 	SOFF_T_R(state->data, 12, len);
 
-	subreq = cli_smb_send(state, ev, cli, SMBlockingX, additional_flags,
+	subreq = cli_smb_send(state, ev, cli, SMBlockingX, additional_flags, 0,
 				8, state->vwv, 20, state->data);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -3344,6 +3401,7 @@ static struct tevent_req *cli_posix_lock_internal_send(TALLOC_CTX *mem_ctx,
 	subreq = cli_trans_send(state,                  /* mem ctx. */
 				ev,                     /* event ctx. */
 				cli,                    /* cli_state. */
+				0,			/* additional_flags2 */
 				SMBtrans2,              /* cmd. */
 				NULL,                   /* pipe name. */
 				-1,                     /* fid. */
@@ -3536,7 +3594,7 @@ struct tevent_req *cli_getattrE_send(TALLOC_CTX *mem_ctx,
 	state->zone_offset = smb1cli_conn_server_time_zone(cli->conn);
 	SSVAL(state->vwv+0,0,fnum);
 
-	subreq = cli_smb_send(state, ev, cli, SMBgetattrE, additional_flags,
+	subreq = cli_smb_send(state, ev, cli, SMBgetattrE, additional_flags, 0,
 			      1, state->vwv, 0, NULL);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
@@ -3685,6 +3743,7 @@ struct tevent_req *cli_getatr_send(TALLOC_CTX *mem_ctx,
 	struct tevent_req *req = NULL, *subreq = NULL;
 	struct cli_getatr_state *state = NULL;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list