From 985969d884d070f3e21f76ae97125a2c35038e9c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 2 Feb 2022 10:49:17 -0800 Subject: [PATCH 1/2] 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 Reviewed-by: Ralph Boehme (cherry picked from commit 0ecc58858360bcc0181a02e52ada3e8327f97c5b) --- selftest/knownfail.d/libsmbclient_rename | 1 + source4/torture/libsmbclient/libsmbclient.c | 112 ++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 selftest/knownfail.d/libsmbclient_rename 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"); -- 2.32.0 From 65363f162ec6f4e047bca6f0c3d87384a85bb47e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 2 Feb 2022 10:52:09 -0800 Subject: [PATCH 2/2] lib: libsmbclient: Ensure cli_rename() always sets cli->raw_status. Identical change as used in cli_unlink(), cli_mkdir(), cli_rmdir() cli_chkpath() to ensure SMB2 calls correctly set raw_status for libsmbclient uses. Remove knownfail. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14938 Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Wed Feb 2 21:50:31 UTC 2022 on sn-devel-184 (cherry picked from commit ca60f6350d566b7ecc822bcbb44fb65a1d150bbe) --- selftest/knownfail.d/libsmbclient_rename | 1 - source3/libsmb/clifile.c | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 selftest/knownfail.d/libsmbclient_rename diff --git a/selftest/knownfail.d/libsmbclient_rename b/selftest/knownfail.d/libsmbclient_rename deleted file mode 100644 index 88343b7d5ef..00000000000 --- a/selftest/knownfail.d/libsmbclient_rename +++ /dev/null @@ -1 +0,0 @@ -^samba4.libsmbclient.rename.SMB3.rename\(nt4_dc\) diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index f1d0a9483f6..3c3f44923fc 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -1489,6 +1489,7 @@ NTSTATUS cli_rename(struct cli_state *cli, } status = cli_rename_recv(req); + cli->raw_status = status; /* cli_smb2_rename_recv doesn't set this */ fail: TALLOC_FREE(frame); -- 2.32.0