The branch, master has been updated
via 37c7952a2e5 s4:torture/smb2: Fix torture test case
smb2.acls.ACCESS_BASED
via ab0371c442f s4:torture/smb2: Mark smb2.acl.SDFLAGSVSCHOWN as not
supported for windows
via 8449a4eae41 s4:torture/smb2: Restore original sd for every test
case finish
via 63e9ffee058 s4:torture: Add new target 'w2k16'
from f265195d387 third_party:ngtcp2 Fix compilation with clang-20
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 37c7952a2e5526b8278cba17e5cb4d26ce0a30e0
Author: Vinit Agnihotri <[email protected]>
Date: Wed Jul 30 10:16:05 2025 +0530
s4:torture/smb2: Fix torture test case smb2.acls.ACCESS_BASED
Currently this test case fails to run against windows target, as
it is hardcoded to use sharename as "hideunread".
This change enables this test case to be executed against windows,
by omitting use of hideunread share and relevant flags.
Signed-off-by: Vinit Agnihotri <[email protected]>
Reviewed-by: Anoop C S <[email protected]>
Reviewed-by: Ralph Boehme <[email protected]>
Autobuild-User(master): Anoop C S <[email protected]>
Autobuild-Date(master): Wed Aug 13 18:29:53 UTC 2025 on atb-devel-224
commit ab0371c442f23f11fce6bd9d9a217049bc5ccecd
Author: Vinit Agnihotri <[email protected]>
Date: Fri Jul 11 18:09:58 2025 +0530
s4:torture/smb2: Mark smb2.acl.SDFLAGSVSCHOWN as not supported for windows
Test case is expecting return code of NT_STATUS_OK for changing owner to
'everyone', however 'Windows 2016 server' is returning error code as
NT_STATUS_INVALID_OWNER and test case fails.
Same error code is returned if tested against targets w2k16, win2k12R2,
win10, win11,
win7, win8 and winxp as well.
Thus marking this case as not supported for all windows versions till,
issue is resolved.
Singed-off-by: Vinit Agnihotri <[email protected]>
Reviewed-by: Anoop C S <[email protected]>
Reviewed-by: Ralph Boehme <[email protected]>
commit 8449a4eae41709478c0a118ac51361296696179b
Author: Vinit Agnihotri <[email protected]>
Date: Mon Jul 14 13:40:02 2025 +0530
s4:torture/smb2: Restore original sd for every test case finish
Some tests are not restoring original sd, at end of test.
This causes create test file to stay with incorrect access, resulting
into failure of smb2_deltree() to clear them up, which in-turn causes
other test cases to fail with 'object name collision' for mkdir test
directory.
Fix:
- Call setinfo on testfile with original sd.
- Fix some typos
Signed-off-by: Vinit Agnihotri <[email protected]>
Reviewed-by: Anoop C S <[email protected]>
Reviewed-by: Ralph Boehme <[email protected]>
commit 63e9ffee0580a5fdd0602ede3e4dde2c712b5dc2
Author: Vinit Agnihotri <[email protected]>
Date: Fri Jul 11 18:09:08 2025 +0530
s4:torture: Add new target 'w2k16'
This fix adds new target 'w2k16' which sets default value for option
'hide_on_access_denied' to true.
'windows 2016 server' returns NT_STATUS_OBJECT_NAME_NOT_FOUND on a
createfile when
access is denied rather than NT_STATUS_ACCESS_DENIED. Above option
takes care of this behaviour.
Move TARGET_IS_WINDOWS to utils.h and add all presently defined windows
targets for the same.
Singed-off-by: Vinit Agnihotri <[email protected]>
Reviewed-by: Anoop C S <[email protected]>
Reviewed-by: Ralph Boehme <[email protected]>
-----------------------------------------------------------------------
Summary of changes:
source4/torture/raw/lock.c | 4 -
source4/torture/smb2/acls.c | 275 ++++++++++++++++++++++++++-----------------
source4/torture/smbtorture.c | 4 +
source4/torture/util.h | 8 ++
4 files changed, 176 insertions(+), 115 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source4/torture/raw/lock.c b/source4/torture/raw/lock.c
index 5a8714dc3a5..26c26e5984f 100644
--- a/source4/torture/raw/lock.c
+++ b/source4/torture/raw/lock.c
@@ -72,10 +72,6 @@
#define TARGET_IS_W2K8(_tctx) (torture_setting_bool(_tctx, "w2k8", false))
#define TARGET_IS_WIN7(_tctx) (torture_setting_bool(_tctx, "win7", false))
-#define TARGET_IS_WINDOWS(_tctx) \
- ((torture_setting_bool(_tctx, "w2k3", false)) || \
- (torture_setting_bool(_tctx, "w2k8", false)) || \
- (torture_setting_bool(_tctx, "win7", false)))
#define TARGET_IS_SAMBA3(_tctx) (torture_setting_bool(_tctx, "samba3", false))
#define TARGET_IS_SAMBA4(_tctx) (torture_setting_bool(_tctx, "samba4", false))
diff --git a/source4/torture/smb2/acls.c b/source4/torture/smb2/acls.c
index 0459d6547dc..65b4b0fe363 100644
--- a/source4/torture/smb2/acls.c
+++ b/source4/torture/smb2/acls.c
@@ -88,6 +88,26 @@
} \
} while (0)
+/*
+ * Helper function to restore original sd.
+ */
+static NTSTATUS restore_sd_orig(struct smb2_tree *tree,
+ union smb_setfileinfo *si,
+ struct smb2_handle handle,
+ struct security_descriptor *sd)
+{
+ if (tree == NULL || smb2_util_handle_empty(handle) || sd == NULL) {
+ return NT_STATUS_OK;
+ }
+
+ si->set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
+ si->set_secdesc.in.file.handle = handle;
+ si->set_secdesc.in.secinfo_flags = SECINFO_DACL;
+ si->set_secdesc.in.sd = sd;
+
+ return smb2_setinfo_file(tree, si);
+}
+
/*
test the behaviour of the well known SID_CREATOR_OWNER sid, and some generic
mapping bits
@@ -102,7 +122,7 @@ static bool test_creator_sid(struct torture_context *tctx,
struct smb2_tree *tre
struct smb2_handle handle = {{0}};
union smb_fileinfo q;
union smb_setfileinfo set;
- struct security_descriptor *sd, *sd_orig, *sd2;
+ struct security_descriptor *sd, *sd_orig = NULL, *sd2;
const char *owner_sid;
if (!smb2_util_setup_dir(tctx, tree, BASEDIR))
@@ -274,15 +294,12 @@ static bool test_creator_sid(struct torture_context
*tctx, struct smb2_tree *tre
CHECK_ACCESS_FLAGS(io.out.file.handle, SEC_RIGHTS_FILE_READ);
smb2_util_close(tree, io.out.file.handle);
-
- torture_comment(tctx, "put back original sd\n");
- set.set_secdesc.in.sd = sd_orig;
- status = smb2_setinfo_file(tree, &set);
- CHECK_STATUS(status, NT_STATUS_OK);
-
-
done:
- smb2_util_close(tree, handle);
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &set, handle, sd_orig);
+ if (!smb2_util_handle_empty(handle)) {
+ smb2_util_close(tree, handle);
+ }
smb2_deltree(tree, BASEDIR);
smb2_tdis(tree);
smb2_logoff(tree->session);
@@ -305,7 +322,7 @@ static bool test_generic_bits(struct torture_context *tctx,
struct smb2_tree *tr
int i;
union smb_fileinfo q;
union smb_setfileinfo set;
- struct security_descriptor *sd, *sd_orig, *sd2;
+ struct security_descriptor *sd, *sd_orig = NULL, *sd2;
const char *owner_sid;
const struct {
uint32_t gen_bits;
@@ -640,16 +657,13 @@ static bool test_generic_bits(struct torture_context
*tctx, struct smb2_tree *tr
smb2_util_close(tree, io.out.file.handle);
}
+done:
torture_comment(tctx, "put back original sd\n");
- set.set_secdesc.in.sd = sd_orig;
- status = smb2_setinfo_file(tree, &set);
- CHECK_STATUS(status, NT_STATUS_OK);
-
- smb2_util_close(tree, handle);
+ restore_sd_orig(tree, &set, handle, sd_orig);
+ if (!smb2_util_handle_empty(handle)) {
+ smb2_util_close(tree, handle);
+ }
smb2_util_unlink(tree, fname);
-
-done:
- smb2_util_close(tree, handle);
smb2_deltree(tree, BASEDIR);
smb2_tdis(tree);
smb2_logoff(tree->session);
@@ -671,7 +685,7 @@ static bool test_owner_bits(struct torture_context *tctx,
struct smb2_tree *tree
int i;
union smb_fileinfo q;
union smb_setfileinfo set;
- struct security_descriptor *sd, *sd_orig;
+ struct security_descriptor *sd, *sd_orig = NULL;
const char *owner_sid;
uint32_t expected_bits;
@@ -775,13 +789,12 @@ static bool test_owner_bits(struct torture_context *tctx,
struct smb2_tree *tree
}
}
- torture_comment(tctx, "put back original sd\n");
- set.set_secdesc.in.sd = sd_orig;
- status = smb2_setinfo_file(tree, &set);
- CHECK_STATUS(status, NT_STATUS_OK);
-
done:
- smb2_util_close(tree, handle);
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &set, handle, sd_orig);
+ if (!smb2_util_handle_empty(handle)) {
+ smb2_util_close(tree, handle);
+ }
smb2_util_unlink(tree, fname);
smb2_deltree(tree, BASEDIR);
smb2_tdis(tree);
@@ -1252,19 +1265,14 @@ static bool test_inheritance(struct torture_context
*tctx, struct smb2_tree *tre
CHECK_ACCESS_FLAGS(handle2, SEC_FILE_WRITE_DATA);
smb2_util_close(tree, handle2);
- smb2_util_unlink(tree, fname1);
- smb2_util_rmdir(tree, dname);
-
done:
- if (sd_orig != NULL) {
- set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
- set.set_secdesc.in.file.handle = handle;
- set.set_secdesc.in.secinfo_flags = SECINFO_DACL;
- set.set_secdesc.in.sd = sd_orig;
- status = smb2_setinfo_file(tree, &set);
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &set, handle, sd_orig);
+ if (!smb2_util_handle_empty(handle)) {
+ smb2_util_close(tree, handle);
}
-
- smb2_util_close(tree, handle);
+ smb2_util_unlink(tree, fname1);
+ smb2_util_rmdir(tree, dname);
smb2_deltree(tree, BASEDIR);
smb2_tdis(tree);
smb2_logoff(tree->session);
@@ -1493,7 +1501,12 @@ static bool test_inheritance_flags(struct
torture_context *tctx,
}
done:
- smb2_util_close(tree, handle);
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &set, handle, sd_orig);
+ if (!smb2_util_handle_empty(handle)) {
+ smb2_util_close(tree, handle);
+ }
+ smb2_util_unlink(tree, fname1);
smb2_deltree(tree, BASEDIR);
smb2_tdis(tree);
smb2_logoff(tree->session);
@@ -1532,6 +1545,10 @@ static bool test_sd_flags_vs_chown(struct
torture_context *tctx,
uint32_t child_get_ace_inherit;
} tflags[16] = {{0}}; /* 2^4 */
+ if (TARGET_IS_WINDOWS(tctx)) {
+ torture_skip(tctx, "Not supported by windows backend\n");
+ }
+
owner_sd = security_descriptor_dacl_create(tctx,
0,
SID_WORLD,
@@ -1770,7 +1787,12 @@ static bool test_sd_flags_vs_chown(struct
torture_context *tctx,
}
done:
- smb2_util_close(tree, handle);
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &set, handle, sd_orig);
+ if (!smb2_util_handle_empty(handle)) {
+ smb2_util_close(tree, handle);
+ }
+ smb2_util_unlink(tree, fname1);
smb2_deltree(tree, BASEDIR);
smb2_tdis(tree);
smb2_logoff(tree->session);
@@ -1902,17 +1924,13 @@ static bool test_inheritance_dynamic(struct
torture_context *tctx,
}
CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
- smb2_util_unlink(tree, fname1);
-
done:
torture_comment(tctx, "put back original sd\n");
- set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
- set.set_secdesc.in.file.handle = handle;
- set.set_secdesc.in.secinfo_flags = SECINFO_DACL;
- set.set_secdesc.in.sd = sd_orig;
- status = smb2_setinfo_file(tree, &set);
-
- smb2_util_close(tree, handle);
+ restore_sd_orig(tree, &set, handle, sd_orig);
+ if (!smb2_util_handle_empty(handle)) {
+ smb2_util_close(tree, handle);
+ }
+ smb2_util_unlink(tree, fname1);
smb2_util_rmdir(tree, dname);
smb2_deltree(tree, BASEDIR);
smb2_tdis(tree);
@@ -2147,7 +2165,8 @@ static bool test_access_based(struct torture_context
*tctx,
struct smb2_create io;
const char *fname = BASEDIR "\\testfile";
bool ret = true;
- struct smb2_handle fhandle, dhandle;
+ struct smb2_handle fhandle = {{0}};
+ struct smb2_handle dhandle = {{0}};
union smb_fileinfo q;
union smb_setfileinfo set;
struct security_descriptor *sd, *sd_orig=NULL;
@@ -2182,12 +2201,16 @@ static bool test_access_based(struct torture_context
*tctx,
ZERO_STRUCT(fhandle);
ZERO_STRUCT(dhandle);
- if (!torture_smb2_con_share(tctx, "hideunread", &tree1)) {
- torture_result(tctx, TORTURE_FAIL, "(%s) Unable to connect "
- "to share 'hideunread'\n",
- __location__);
- ret = false;
- goto done;
+ if (TARGET_IS_WINDOWS(tctx)) {
+ tree1 = tree;
+ } else {
+ if (!torture_smb2_con_share(tctx, "hideunread", &tree1)) {
+ torture_result(tctx, TORTURE_FAIL, "(%s) Unable to
connect "
+ "to share 'hideunread'\n",
+ __location__);
+ ret = false;
+ goto done;
+ }
}
flags = smb2cli_tcon_flags(tree1->smbXcli);
@@ -2197,7 +2220,8 @@ static bool test_access_based(struct torture_context
*tctx,
torture_comment(tctx, "TESTING ACCESS BASED ENUMERATION\n");
- if ((flags & SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM)==0) {
+ if (((flags & SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM)==0) &&
+ (!TARGET_IS_WINDOWS(tctx))) {
torture_result(tctx, TORTURE_FAIL, "(%s) No access enumeration "
"on share 'hideunread'\n",
__location__);
@@ -2315,17 +2339,24 @@ static bool test_access_based(struct torture_context
*tctx,
}
done:
-
if (tree1) {
- smb2_util_close(tree1, fhandle);
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree1, &set, fhandle, sd_orig);
+ if (!smb2_util_handle_empty(fhandle)) {
+ smb2_util_close(tree1, fhandle);
+ }
smb2_util_close(tree1, dhandle);
smb2_util_unlink(tree1, fname);
smb2_deltree(tree1, BASEDIR);
smb2_tdis(tree1);
smb2_logoff(tree1->session);
}
- smb2_tdis(tree);
- smb2_logoff(tree->session);
+
+ if (tree != tree1) {
+ smb2_tdis(tree);
+ smb2_logoff(tree->session);
+ }
+
return ret;
}
@@ -2458,9 +2489,12 @@ static bool test_owner_rights(struct torture_context
*tctx,
ZERO_STRUCT(handle);
done:
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &si, handle, sd_orig);
if (!smb2_util_handle_empty(handle)) {
smb2_util_close(tree, handle);
}
+ smb2_util_unlink(tree, fname);
smb2_deltree(tree, BASEDIR);
return ret;
}
@@ -2474,6 +2508,7 @@ static bool test_owner_rights_deny(struct torture_context
*tctx,
const char *fname = BASEDIR "\\owner_right_deny.txt";
struct smb2_create cr;
struct smb2_handle handle = {{0}};
+ struct smb2_handle handle2 = {{0}};
union smb_fileinfo gi;
union smb_setfileinfo si;
struct security_descriptor *sd_orig = NULL;
@@ -2553,11 +2588,6 @@ static bool test_owner_rights_deny(struct
torture_context *tctx,
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_setinfo_file failed\n");
- status = smb2_util_close(tree, handle);
- torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
- "smb2_util_close failed\n");
- ZERO_STRUCT(handle);
-
cr = (struct smb2_create) {
.in.desired_access = SEC_STD_READ_CONTROL,
.in.file_attributes = FILE_ATTRIBUTE_NORMAL,
@@ -2570,12 +2600,12 @@ static bool test_owner_rights_deny(struct
torture_context *tctx,
status = smb2_create(tree, tctx, &cr);
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
- "smb2_setinfo_file failed\n");
- handle = cr.out.file.handle;
+ "smb2_create failed\n");
+ handle2 = cr.out.file.handle;
mxac_status = NT_STATUS(cr.out.maximal_access_status);
torture_assert_ntstatus_ok_goto(tctx, mxac_status, ret, done,
- "smb2_setinfo_file failed\n");
+ "Invalid maximal access status\n");
/*
* For some reasons Windows 2016 doesn't set SEC_STD_DELETE but we
@@ -2587,15 +2617,23 @@ static bool test_owner_rights_deny(struct
torture_context *tctx,
ret, done,
"Wrong maximum access\n");
- status = smb2_util_close(tree, handle);
+ status = smb2_util_close(tree, handle2);
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_util_close failed\n");
- ZERO_STRUCT(handle);
+ ZERO_STRUCT(handle2);
done:
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &si, handle, sd_orig);
+
+ if (!smb2_util_handle_empty(handle2)) {
+ smb2_util_close(tree, handle2);
+ }
+
if (!smb2_util_handle_empty(handle)) {
smb2_util_close(tree, handle);
}
+ smb2_util_unlink(tree, fname);
smb2_deltree(tree, BASEDIR);
return ret;
}
@@ -2609,6 +2647,7 @@ static bool test_owner_rights_deny1(struct
torture_context *tctx,
const char *fname = BASEDIR "\\owner_right_deny1.txt";
struct smb2_create cr;
struct smb2_handle handle = {{0}};
+ struct smb2_handle handle2 = {{0}};
union smb_fileinfo gi;
union smb_setfileinfo si;
struct security_descriptor *sd_orig = NULL;
@@ -2695,11 +2734,6 @@ static bool test_owner_rights_deny1(struct
torture_context *tctx,
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_setinfo_file failed\n");
- status = smb2_util_close(tree, handle);
- torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
- "smb2_util_close failed\n");
- ZERO_STRUCT(handle);
-
cr = (struct smb2_create) {
.in.desired_access = SEC_STD_READ_CONTROL,
.in.file_attributes = FILE_ATTRIBUTE_NORMAL,
@@ -2712,12 +2746,12 @@ static bool test_owner_rights_deny1(struct
torture_context *tctx,
status = smb2_create(tree, tctx, &cr);
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
- "smb2_setinfo_file failed\n");
- handle = cr.out.file.handle;
+ "smb2_create failed\n");
+ handle2 = cr.out.file.handle;
mxac_status = NT_STATUS(cr.out.maximal_access_status);
torture_assert_ntstatus_ok_goto(tctx, mxac_status, ret, done,
- "smb2_setinfo_file failed\n");
+ "Invalid maximal access status\n");
/*
* For some reasons Windows 2016 doesn't set SEC_STD_DELETE but we
@@ -2729,15 +2763,23 @@ static bool test_owner_rights_deny1(struct
torture_context *tctx,
ret, done,
"Wrong maximum access\n");
- status = smb2_util_close(tree, handle);
+ status = smb2_util_close(tree, handle2);
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_util_close failed\n");
- ZERO_STRUCT(handle);
+ ZERO_STRUCT(handle2);
done:
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &si, handle, sd_orig);
+
+ if (!smb2_util_handle_empty(handle2)) {
+ smb2_util_close(tree, handle2);
+ }
+
if (!smb2_util_handle_empty(handle)) {
smb2_util_close(tree, handle);
}
+ smb2_util_unlink(tree, fname);
smb2_deltree(tree, BASEDIR);
return ret;
}
@@ -2752,6 +2794,7 @@ static bool test_deny1(struct torture_context *tctx,
const char *fname = BASEDIR "\\test_deny1.txt";
struct smb2_create cr;
struct smb2_handle handle = {{0}};
+ struct smb2_handle handle2 = {{0}};
union smb_fileinfo gi;
union smb_setfileinfo si;
struct security_descriptor *sd_orig = NULL;
@@ -2830,10 +2873,6 @@ static bool test_deny1(struct torture_context *tctx,
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_setinfo_file failed\n");
- status = smb2_util_close(tree, handle);
- torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
- "smb2_util_close failed\n");
- ZERO_STRUCT(handle);
cr = (struct smb2_create) {
.in.desired_access = SEC_STD_READ_CONTROL | SEC_FILE_WRITE_DATA,
@@ -2848,7 +2887,7 @@ static bool test_deny1(struct torture_context *tctx,
status = smb2_create(tree, tctx, &cr);
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_create failed\n");
- handle = cr.out.file.handle;
+ handle2 = cr.out.file.handle;
mxac_status = NT_STATUS(cr.out.maximal_access_status);
torture_assert_ntstatus_ok_goto(tctx, mxac_status, ret, done,
@@ -2867,15 +2906,22 @@ static bool test_deny1(struct torture_context *tctx,
ret, done,
"Wrong maximum access\n");
- status = smb2_util_close(tree, handle);
+ status = smb2_util_close(tree, handle2);
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_util_close failed\n");
- ZERO_STRUCT(handle);
+ ZERO_STRUCT(handle2);
done:
+ torture_comment(tctx, "put back original sd\n");
+ restore_sd_orig(tree, &si, handle, sd_orig);
if (!smb2_util_handle_empty(handle)) {
smb2_util_close(tree, handle);
}
+
+ if (!smb2_util_handle_empty(handle2)) {
+ smb2_util_close(tree, handle2);
+ }
+ smb2_util_unlink(tree, fname);
smb2_deltree(tree, BASEDIR);
return ret;
}
@@ -2894,6 +2940,7 @@ static bool test_mxac_not_granted(struct torture_context
*tctx,
const char *fname = BASEDIR "\\test_mxac_not_granted.txt";
struct smb2_create cr;
struct smb2_handle handle = {{0}};
+ struct smb2_handle handle2 = {{0}};
union smb_fileinfo gi;
union smb_setfileinfo si;
struct security_descriptor *sd_orig = NULL;
@@ -2960,11 +3007,6 @@ static bool test_mxac_not_granted(struct torture_context
*tctx,
torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
"smb2_setinfo_file failed\n");
- status = smb2_util_close(tree, handle);
- torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
- "smb2_util_close failed\n");
--
Samba Shared Repository