summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2022-02-02 10:49:17 -0800
committerJule Anger <janger@samba.org>2022-02-04 07:46:50 +0000
commit5c55418c25eb18d44416f486d1468ca6ccce0ab7 (patch)
tree5d6efd5c838bc268b929e4df5d0ded962d96a823
parent29355d0a2d4e2b64a0cd1b8d16067f94f1594114 (diff)
downloadsamba-5c55418c25eb18d44416f486d1468ca6ccce0ab7.tar.gz
s4: test: Add samba4.libsmbclient.rename test. Currently fails for SMB3.
Add knownfail.d/libsmbclient_rename BUG: https://bugzilla.samba.org/show_bug.cgi?id=14938 Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org> (cherry picked from commit 0ecc58858360bcc0181a02e52ada3e8327f97c5b)
-rw-r--r--selftest/knownfail.d/libsmbclient_rename1
-rw-r--r--source4/torture/libsmbclient/libsmbclient.c112
2 files changed, 113 insertions, 0 deletions
diff --git a/selftest/knownfail.d/libsmbclient_rename b/selftest/knownfail.d/libsmbclient_rename
new file mode 100644
index 00000000000..88343b7d5ef
--- /dev/null
+++ b/selftest/knownfail.d/libsmbclient_rename
@@ -0,0 +1 @@
+^samba4.libsmbclient.rename.SMB3.rename\(nt4_dc\)
diff --git a/source4/torture/libsmbclient/libsmbclient.c b/source4/torture/libsmbclient/libsmbclient.c
index fd770e5002f..b04dbde04ac 100644
--- a/source4/torture/libsmbclient/libsmbclient.c
+++ b/source4/torture/libsmbclient/libsmbclient.c
@@ -1303,6 +1303,115 @@ out:
return ok;
}
+static bool torture_libsmbclient_rename(struct torture_context *tctx)
+{
+ SMBCCTX *ctx = NULL;
+ int fhandle = -1;
+ bool success = false;
+ const char *filename_src = NULL;
+ const char *filename_dst = NULL;
+ int ret;
+ const char *smburl = torture_setting_string(tctx, "smburl", NULL);
+
+ if (smburl == NULL) {
+ torture_fail(tctx,
+ "option --option=torture:smburl="
+ "smb://user:password@server/share missing\n");
+ }
+
+ torture_assert_goto(tctx,
+ torture_libsmbclient_init_context(tctx, &ctx),
+ success,
+ done,
+ "");
+
+ smbc_set_context(ctx);
+
+ filename_src = talloc_asprintf(tctx,
+ "%s/src",
+ smburl);
+ if (filename_src == NULL) {
+ torture_fail_goto(tctx, done, "talloc fail\n");
+ }
+
+ filename_dst = talloc_asprintf(tctx,
+ "%s/dst",
+ smburl);
+ if (filename_dst == NULL) {
+ torture_fail_goto(tctx, done, "talloc fail\n");
+ }
+
+ /* Ensure the files don't exist. */
+ smbc_unlink(filename_src);
+ smbc_unlink(filename_dst);
+
+ /* Create them. */
+ fhandle = smbc_creat(filename_src, 0666);
+ if (fhandle < 0) {
+ torture_fail_goto(tctx,
+ done,
+ talloc_asprintf(tctx,
+ "failed to create file '%s': %s",
+ filename_src,
+ strerror(errno)));
+ }
+ ret = smbc_close(fhandle);
+ torture_assert_int_equal_goto(tctx,
+ ret,
+ 0,
+ success,
+ done,
+ talloc_asprintf(tctx,
+ "failed to close handle for '%s'",
+ filename_src));
+
+ fhandle = smbc_creat(filename_dst, 0666);
+ if (fhandle < 0) {
+ torture_fail_goto(tctx,
+ done,
+ talloc_asprintf(tctx,
+ "failed to create file '%s': %s",
+ filename_dst,
+ strerror(errno)));
+ }
+ ret = smbc_close(fhandle);
+ torture_assert_int_equal_goto(tctx,
+ ret,
+ 0,
+ success,
+ done,
+ talloc_asprintf(tctx,
+ "failed to close handle for '%s'",
+ filename_dst));
+
+ ret = smbc_rename(filename_src, filename_dst);
+
+ /*
+ * BUG: https://bugzilla.samba.org/show_bug.cgi?id=14938
+ * gives ret == -1, but errno = 0 for overwrite renames
+ * over SMB2.
+ */
+ torture_assert_int_equal_goto(tctx,
+ ret,
+ 0,
+ success,
+ done,
+ talloc_asprintf(tctx,
+ "smbc_rename '%s' -> '%s' failed with %s\n",
+ filename_src,
+ filename_dst,
+ strerror(errno)));
+
+ /* Remove them again. */
+ smbc_unlink(filename_src);
+ smbc_unlink(filename_dst);
+ success = true;
+
+ done:
+ smbc_free_context(ctx, 1);
+ return success;
+}
+
NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
{
struct torture_suite *suite;
@@ -1326,6 +1435,9 @@ NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
suite, "utimes", torture_libsmbclient_utimes);
torture_suite_add_simple_test(
suite, "noanon_list", torture_libsmbclient_noanon_list);
+ torture_suite_add_simple_test(suite,
+ "rename",
+ torture_libsmbclient_rename);
suite->description = talloc_strdup(suite, "libsmbclient interface tests");