From 7c8dea14da645d5e98eacd82b82b2a7c8c6b242f Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Fri, 20 Oct 2023 15:45:31 +0200 Subject: [PATCH] smbtorture: add test for fruit:validate_afpinfo option Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Tue Oct 24 22:30:06 UTC 2023 on atb-devel-224 --- selftest/target/Samba3.pm | 1 + source3/selftest/tests.py | 7 +++++ source4/torture/vfs/fruit.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ source4/torture/vfs/vfs.c | 1 + 4 files changed, 78 insertions(+) diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index a28e2be0581..ef68f63e348 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -3246,6 +3246,7 @@ sub provision($$) fruit:resource = file fruit:metadata = stream fruit:zero_file_id=yes + fruit:validate_afpinfo = no [fruit_resource_stream] path = $fruit_resource_stream_shrdir diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py index 2877273b8e1..8141b7e59ad 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -1836,6 +1836,13 @@ plantestsuite("samba3.blackbox.force-user-unlink", [os.path.join(samba3srcdir, "script/tests/test_force_user_unlink.sh")]) +plansmbtorture4testsuite( + "vfs.fruit_validate_afpinfo", "fileserver", + '//$SERVER_IP/vfs_fruit -U$USERNAME%$PASSWORD --option=torture:validate_afpinfo=yes') +plansmbtorture4testsuite( + "vfs.fruit_validate_afpinfo", "fileserver", + '//$SERVER_IP/vfs_fruit_zero_fileid -U$USERNAME%$PASSWORD --option=torture:validate_afpinfo=no') + def planclusteredmembertestsuite(tname, prefix): '''Define a clustered test for the clusteredmember environment''' diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index 99d63becbb4..b9cab0c5467 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -8768,3 +8768,72 @@ struct torture_suite *torture_vfs_fruit_unfruit(TALLOC_CTX *ctx) return suite; } + +/* + * Write an invalid AFP_AfpInfo stream header + */ +bool test_fruit_validate_afpinfo(struct torture_context *tctx, + struct smb2_tree *tree) +{ + bool expect_invalid_param = torture_setting_bool(tctx, "validate_afpinfo", true); + const char *fname = "test_fruit_validate_afpinfo"; + const char *sname = "test_fruit_validate_afpinfo" AFPINFO_STREAM_NAME; + struct smb2_handle handle; + AfpInfo *afpinfo = NULL; + char *afpinfo_buf = NULL; + uint8_t valbuf[8]; + NTSTATUS status; + bool ret = true; + + torture_comment(tctx, "Checking create of AfpInfo stream\n"); + + smb2_util_unlink(tree, fname); + + ret = torture_setup_file(tctx, tree, fname, false); + torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file failed"); + + afpinfo = torture_afpinfo_new(tctx); + torture_assert_not_null_goto(tctx, afpinfo, ret, done, + "torture_afpinfo_new failed\n"); + + memcpy(afpinfo->afpi_FinderInfo, "FOO BAR ", 8); + + ret = torture_write_afpinfo(tree, tctx, tctx, fname, afpinfo); + torture_assert_goto(tctx, ret == true, ret, done, + "torture_write_afpinfo failed\n"); + + afpinfo_buf = talloc_zero_size(tctx, 60); + torture_assert_goto(tctx, afpinfo_buf != NULL, ret, done, + "torture_afpinfo_new failed"); + memcpy(afpinfo_buf + 16, "FOO ", 4); + + status = torture_smb2_testfile_access( + tree, sname, &handle, SEC_FILE_ALL); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "smb2_create failed\n"); + + status = smb2_util_write(tree, handle, afpinfo_buf, 0, AFP_INFO_SIZE); + if (expect_invalid_param) { + torture_assert_ntstatus_equal_goto( + tctx, status, NT_STATUS_INVALID_PARAMETER, ret, done, + "write didn't fail as expected\n"); + } else { + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "smb2_util_write failed"); + } + + smb2_util_close(tree, handle); + + /* + * Verify the server fixed the header + */ + PUSH_BE_U32(valbuf, 0, AFP_Signature); + PUSH_BE_U32(valbuf + 4, 0, AFP_Version); + ret = check_stream(tree, __location__, tctx, tctx, fname, + AFPINFO_STREAM, 0, 60, 0, 8, (char *)valbuf); + torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed"); + +done: + smb2_util_unlink(tree, fname); + return ret; +} diff --git a/source4/torture/vfs/vfs.c b/source4/torture/vfs/vfs.c index 69da13f6d28..3d402eeee0d 100644 --- a/source4/torture/vfs/vfs.c +++ b/source4/torture/vfs/vfs.c @@ -115,6 +115,7 @@ NTSTATUS torture_vfs_init(TALLOC_CTX *ctx) torture_suite_add_suite(suite, torture_vfs_fruit_timemachine(suite)); torture_suite_add_suite(suite, torture_vfs_fruit_conversion(suite)); torture_suite_add_suite(suite, torture_vfs_fruit_unfruit(suite)); + torture_suite_add_1smb2_test(suite, "fruit_validate_afpinfo", test_fruit_validate_afpinfo); torture_register_suite(ctx, suite); -- 2.11.4.GIT