From b967365d2e79e4c15ff31337a978a8e4fb30caa1 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 15 Nov 2017 18:36:54 +0100 Subject: [PATCH 01/11] selftest: reorder arguments for fruit tests This just puts the auth option first matching the first test with the "vfs_fruit" share directly above the modified lines. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 06542b2c4c000e5397f0990713de7f7bb67cc0bd) --- source3/selftest/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py index 4c1ec469efb..bdaf6d4c33f 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -475,8 +475,8 @@ for t in tests: plansmbtorture4testsuite(t, "ad_dc", '//$SERVER/tmp -U$USERNAME%$PASSWORD') elif t == "vfs.fruit": plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share --option=torture:share2=vfs_wo_fruit', 'metadata_netatalk') - plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_metadata_stream --option=torture:share2=vfs_wo_fruit -U$USERNAME%$PASSWORD', 'metadata_stream') - plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_stream_depot --option=torture:share2=vfs_wo_fruit_stream_depot -U$USERNAME%$PASSWORD', 'streams_depot') + plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_metadata_stream -U$USERNAME%$PASSWORD --option=torture:share2=vfs_wo_fruit', 'metadata_stream') + plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_stream_depot -U$USERNAME%$PASSWORD --option=torture:share2=vfs_wo_fruit_stream_depot', 'streams_depot') elif t == "vfs.fruit_netatalk": plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share') elif t == "vfs.fruit_file_id": -- 2.13.6 From 65f0d2c0877b45b1a6c1524822a9bb5c63c25a00 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 15 Nov 2017 18:38:41 +0100 Subject: [PATCH 02/11] selftest: add localdir option to fruit subtests A subsequent commits modifies an existing tests that needs $localdir to also run against "vfs_fruit_metadata_stream" and "vfs_fruit_stream_depot". This reveals test failures, those will be fixed in a subsequent commit. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 3c1bdafde6419c266941624f57cf768e57e2bd98) --- selftest/knownfail.d/samba3.vfs.fruit | 2 ++ source3/selftest/tests.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 selftest/knownfail.d/samba3.vfs.fruit diff --git a/selftest/knownfail.d/samba3.vfs.fruit b/selftest/knownfail.d/samba3.vfs.fruit new file mode 100644 index 00000000000..6df7b499781 --- /dev/null +++ b/selftest/knownfail.d/samba3.vfs.fruit @@ -0,0 +1,2 @@ +^samba3.vfs.fruit metadata_stream.stream names\(nt4_dc\) +^samba3.vfs.fruit streams_depot.stream names\(nt4_dc\) diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py index bdaf6d4c33f..ead890247c3 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -475,8 +475,8 @@ for t in tests: plansmbtorture4testsuite(t, "ad_dc", '//$SERVER/tmp -U$USERNAME%$PASSWORD') elif t == "vfs.fruit": plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share --option=torture:share2=vfs_wo_fruit', 'metadata_netatalk') - plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_metadata_stream -U$USERNAME%$PASSWORD --option=torture:share2=vfs_wo_fruit', 'metadata_stream') - plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_stream_depot -U$USERNAME%$PASSWORD --option=torture:share2=vfs_wo_fruit_stream_depot', 'streams_depot') + plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_metadata_stream -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share --option=torture:share2=vfs_wo_fruit', 'metadata_stream') + plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit_stream_depot -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share --option=torture:share2=vfs_wo_fruit_stream_depot', 'streams_depot') elif t == "vfs.fruit_netatalk": plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/vfs_fruit -U$USERNAME%$PASSWORD --option=torture:localdir=$SELFTEST_PREFIX/nt4_dc/share') elif t == "vfs.fruit_file_id": -- 2.13.6 From 6f7cbcebd72ec01c89d2e64487975087e444fc3c Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Thu, 16 Nov 2017 07:58:34 +0100 Subject: [PATCH 03/11] s4/torture: rework stream names tests usage of local xattr call Previously this test, that tests for correct conversion of ':' in stream names, only worked with streams_xattr with "fruit:metadata" set to "netatalk". In order to have test coverage for fruit shares with other configs, split the test into two: one test creates the stream over SMB and run against all shares, the other one is the unmodified existing test and is only run against the share with streams_xattr and fruit:metadata=netatalk. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 75a3c0f3b1f843ba9a7838aa7a1c311fc262f8c7) --- selftest/knownfail.d/samba3.vfs.fruit | 2 - source4/torture/vfs/fruit.c | 81 +++++++++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 15 deletions(-) delete mode 100644 selftest/knownfail.d/samba3.vfs.fruit diff --git a/selftest/knownfail.d/samba3.vfs.fruit b/selftest/knownfail.d/samba3.vfs.fruit deleted file mode 100644 index 6df7b499781..00000000000 --- a/selftest/knownfail.d/samba3.vfs.fruit +++ /dev/null @@ -1,2 +0,0 @@ -^samba3.vfs.fruit metadata_stream.stream names\(nt4_dc\) -^samba3.vfs.fruit streams_depot.stream names\(nt4_dc\) diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index ace561d0d9c..6f61d4db55f 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -2867,15 +2867,8 @@ static bool test_stream_names(struct torture_context *tctx, /* UTF8 private use are starts at 0xef 0x80 0x80 (0xf000) */ const char *streams[] = { ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */ - ":bar" "\xef\x80\xa2" "baz:$DATA", /* "bar:baz:$DATA" */ "::$DATA" }; - const char *localdir = NULL; - - localdir = torture_setting_string(tctx, "localdir", NULL); - if (localdir == NULL) { - torture_skip(tctx, "Need localdir for test"); - } sname1 = talloc_asprintf(mem_ctx, "%s%s", fname, streams[0]); @@ -2904,12 +2897,7 @@ static bool test_stream_names(struct torture_context *tctx, CHECK_STATUS(status, NT_STATUS_OK); smb2_util_close(tree, create.out.file.handle); - ret = torture_setup_local_xattr(tctx, "localdir", BASEDIR "/stream_names.txt", - "user.DosStream.bar:baz:$DATA", - "data", strlen("data")); - CHECK_VALUE(ret, true); - - ret = check_stream_list(tree, tctx, fname, 3, streams, false); + ret = check_stream_list(tree, tctx, fname, 2, streams, false); CHECK_VALUE(ret, true); done: @@ -4426,6 +4414,72 @@ struct torture_suite *torture_vfs_fruit(TALLOC_CTX *ctx) return suite; } +static bool test_stream_names_local(struct torture_context *tctx, + struct smb2_tree *tree) +{ + TALLOC_CTX *mem_ctx = talloc_new(tctx); + NTSTATUS status; + struct smb2_create create; + struct smb2_handle h; + const char *fname = BASEDIR "\\stream_names.txt"; + const char *sname1; + bool ret; + /* UTF8 private use are starts at 0xef 0x80 0x80 (0xf000) */ + const char *streams[] = { + ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */ + ":bar" "\xef\x80\xa2" "baz:$DATA", /* "bar:baz:$DATA" */ + "::$DATA" + }; + const char *localdir = NULL; + + localdir = torture_setting_string(tctx, "localdir", NULL); + if (localdir == NULL) { + torture_skip(tctx, "Need localdir for test"); + } + + sname1 = talloc_asprintf(mem_ctx, "%s%s", fname, streams[0]); + + /* clean slate ...*/ + smb2_util_unlink(tree, fname); + smb2_deltree(tree, fname); + smb2_deltree(tree, BASEDIR); + + status = torture_smb2_testdir(tree, BASEDIR, &h); + CHECK_STATUS(status, NT_STATUS_OK); + smb2_util_close(tree, h); + + torture_comment(tctx, "(%s) testing stream names\n", __location__); + ZERO_STRUCT(create); + create.in.desired_access = SEC_FILE_WRITE_DATA; + create.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + create.in.share_access = + NTCREATEX_SHARE_ACCESS_DELETE| + NTCREATEX_SHARE_ACCESS_READ| + NTCREATEX_SHARE_ACCESS_WRITE; + create.in.create_disposition = NTCREATEX_DISP_CREATE; + create.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS; + create.in.fname = sname1; + + status = smb2_create(tree, mem_ctx, &create); + CHECK_STATUS(status, NT_STATUS_OK); + smb2_util_close(tree, create.out.file.handle); + + ret = torture_setup_local_xattr(tctx, "localdir", BASEDIR "/stream_names.txt", + "user.DosStream.bar:baz:$DATA", + "data", strlen("data")); + CHECK_VALUE(ret, true); + + ret = check_stream_list(tree, tctx, fname, 3, streams, false); + CHECK_VALUE(ret, true); + +done: + status = smb2_util_unlink(tree, fname); + smb2_deltree(tree, BASEDIR); + talloc_free(mem_ctx); + + return ret; +} + struct torture_suite *torture_vfs_fruit_netatalk(TALLOC_CTX *ctx) { struct torture_suite *suite = torture_suite_create( @@ -4435,6 +4489,7 @@ struct torture_suite *torture_vfs_fruit_netatalk(TALLOC_CTX *ctx) torture_suite_add_1smb2_test(suite, "read netatalk metadata", test_read_netatalk_metadata); torture_suite_add_1smb2_test(suite, "OS X AppleDouble file conversion", test_adouble_conversion); + torture_suite_add_1smb2_test(suite, "stream names with locally created xattr", test_stream_names_local); return suite; } -- 2.13.6 From 0ecf7d9dfeb71a155c1abb5699d001e1290a7809 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Fri, 17 Nov 2017 12:41:49 +0100 Subject: [PATCH 04/11] s4/torture: use torture_assert_goto in a vfs.fruit test No change in behavior. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 9af9c5c073d88b126aebd4a2d7a1a1971527fbf4) --- source4/torture/vfs/fruit.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index 6f61d4db55f..f5b4f654f7b 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -2032,14 +2032,17 @@ static bool test_adouble_conversion(struct torture_context *tctx, torture_comment(tctx, "(%s) test OS X AppleDouble conversion\n", __location__); - ret &= check_stream(tree, __location__, tctx, mem_ctx, - fname, AFPRESOURCE_STREAM, - 16, datalen, 0, datalen, data); + ret = check_stream(tree, __location__, tctx, mem_ctx, + fname, AFPRESOURCE_STREAM, + 16, datalen, 0, datalen, data); + torture_assert_goto(tctx, ret == true, ret, done, + "check AFPRESOURCE_STREAM failed\n"); - ret &= check_stream(tree, __location__, tctx, mem_ctx, - fname, - ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */ - 0, 3, 0, 3, "baz"); + ret = check_stream(tree, __location__, tctx, mem_ctx, fname, + ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */ + 0, 3, 0, 3, "baz"); + torture_assert_goto(tctx, ret == true, ret, done, + "check foo:bar stream failed\n"); done: smb2_deltree(tree, BASEDIR); -- 2.13.6 From 5c6dcd4b7648164cb2b3dd2c037b97ca0d38c70f Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 15 Nov 2017 18:39:53 +0100 Subject: [PATCH 05/11] selftest: run AppleDouble sidecar-file conversion test runs against all fruit shares This needs for work in all possible fruit configs, so test it. This currently fails with stream_depot, as we don't propely copy over the resourcefork data from the ._ file to the stream. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit e28dd6a0ce753a880b2512eb62661411b20f763b) --- selftest/knownfail.d/samba3.vfs.fruit | 1 + source4/torture/vfs/fruit.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 selftest/knownfail.d/samba3.vfs.fruit diff --git a/selftest/knownfail.d/samba3.vfs.fruit b/selftest/knownfail.d/samba3.vfs.fruit new file mode 100644 index 00000000000..8df25bccb79 --- /dev/null +++ b/selftest/knownfail.d/samba3.vfs.fruit @@ -0,0 +1 @@ +^samba3.vfs.fruit streams_depot.OS X AppleDouble file conversion\(nt4_dc\) diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index f5b4f654f7b..3c3810ceaa6 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -4413,6 +4413,7 @@ struct torture_suite *torture_vfs_fruit(TALLOC_CTX *ctx) torture_suite_add_2ns_smb2_test(suite, "invalid AFP_AfpInfo", test_invalid_afpinfo); torture_suite_add_1smb2_test(suite, "creating rsrc with read-only access", test_rfork_create_ro); torture_suite_add_1smb2_test(suite, "copy-chunk streams", test_copy_chunk_streams); + torture_suite_add_1smb2_test(suite, "OS X AppleDouble file conversion", test_adouble_conversion); return suite; } @@ -4491,7 +4492,6 @@ struct torture_suite *torture_vfs_fruit_netatalk(TALLOC_CTX *ctx) suite->description = talloc_strdup(suite, "vfs_fruit tests for Netatalk interop that require fruit:metadata=netatalk"); torture_suite_add_1smb2_test(suite, "read netatalk metadata", test_read_netatalk_metadata); - torture_suite_add_1smb2_test(suite, "OS X AppleDouble file conversion", test_adouble_conversion); torture_suite_add_1smb2_test(suite, "stream names with locally created xattr", test_stream_names_local); return suite; -- 2.13.6 From c9654add2b76d50085a263efa30016d88c8acb4d Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Fri, 17 Nov 2017 08:13:10 +0100 Subject: [PATCH 06/11] s4/torture: let write_stream() deal with stream=NULL Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit ac880848a905a3840b69af2cb1d842d307401a07) --- source4/torture/vfs/fruit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index 3c3810ceaa6..471a755a40d 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -1140,7 +1140,7 @@ static bool write_stream(struct smb2_tree *tree, NTSTATUS status; const char *full_name; - full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname); + full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname ? sname : ""); if (full_name == NULL) { torture_comment(tctx, "talloc_asprintf error\n"); return false; -- 2.13.6 From 1e03a8624ee9b0480644926040800e48a829b040 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Fri, 17 Nov 2017 13:52:25 +0100 Subject: [PATCH 07/11] selftest: add "fruit:veto_appledouble = no" to fruit shares This is needed for a subsequent commit that modifies an existing test to write a ._ file over SMB instead of using the ugly local creation hack. SMB acces of ._ files requires "fruit:veto_appledouble = no", so let's set it. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 3f9b45a410384904d64bdd0d68ff2a5bc25bd3e9) --- selftest/target/Samba3.pm | 3 +++ source4/torture/vfs/fruit.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index 2a4069a585c..78dc105b187 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -1809,18 +1809,21 @@ sub provision($$$$$$$$$) fruit:metadata = netatalk fruit:locking = netatalk fruit:encoding = native + fruit:veto_appledouble = no [vfs_fruit_metadata_stream] path = $shrdir vfs objects = fruit streams_xattr acl_xattr fruit:resource = file fruit:metadata = stream + fruit:veto_appledouble = no [vfs_fruit_stream_depot] path = $shrdir vfs objects = fruit streams_depot acl_xattr fruit:resource = stream fruit:metadata = stream + fruit:veto_appledouble = no [vfs_wo_fruit] path = $shrdir diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index 471a755a40d..0b7f897b4ee 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -4015,6 +4015,9 @@ static bool test_readdir_attr_illegal_ntfs(struct torture_context *tctx, if (!strcmp(found, ".") || !strcmp(found, "..")) continue; + if (strncmp(found, "._", 2) == 0) { + continue; + } break; } -- 2.13.6 From 2943c02cb8cdfcbc2bfae91a77deda62dd73811f Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Fri, 17 Nov 2017 12:53:42 +0100 Subject: [PATCH 08/11] s4/torture: fruit: remove use of localdir from test_adouble_conversion test The previous use of localdir and torture_setup_local_file() was motivated by the fact that by default vfs_fruit rejects access to files with a "._" prefix. Since a previous commit allowed SMB access to ._ files, rewrite the test_adouble_conversion() test to create the ._ AppleDouble file over SMB. This also renders torture_setup_local_file() obsolete. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit ebbffd80862d7d7b025eca219bc0c8f818585ac9) --- source4/torture/vfs/fruit.c | 77 +++++++++------------------------------------ 1 file changed, 14 insertions(+), 63 deletions(-) diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index 0b7f897b4ee..70e5c027928 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -1210,49 +1210,6 @@ static bool torture_setup_local_xattr(struct torture_context *tctx, return ret; } -static bool torture_setup_local_file(struct torture_context *tctx, - const char *path_option, - const char *name, - const char *buf, - size_t size) -{ - int fd; - const char *spath; - char *path; - ssize_t rsize; - - spath = torture_setting_string(tctx, path_option, NULL); - if (spath == NULL) { - printf("No sharepath for option %s\n", path_option); - return false; - } - - path = talloc_asprintf(tctx, "%s/%s", spath, name); - if (path == NULL) { - return false; - } - - fd = creat(path, S_IRWXU); - TALLOC_FREE(path); - if (fd == -1) { - return false; - } - - if ((buf == NULL) || (size == 0)) { - close(fd); - return true; - } - - rsize = write(fd, buf, size); - if (rsize != size) { - return false; - } - - close(fd); - - return true; -} - /** * Create a file or directory **/ @@ -1996,38 +1953,32 @@ static bool test_adouble_conversion(struct torture_context *tctx, { TALLOC_CTX *mem_ctx = talloc_new(tctx); const char *fname = BASEDIR "\\test_adouble_conversion"; - const char *fname_local = BASEDIR "/test_adouble_conversion"; - const char *adname_local = BASEDIR "/._test_adouble_conversion"; + const char *adname = BASEDIR "/._test_adouble_conversion"; NTSTATUS status; struct smb2_handle testdirh; bool ret = true; const char *data = "This resource fork intentionally left blank"; size_t datalen = strlen(data); - const char *localdir = NULL; - - localdir = torture_setting_string(tctx, "localdir", NULL); - if (localdir == NULL) { - torture_skip(tctx, "Need localdir for test"); - } - smb2_util_unlink(tree, fname); + smb2_deltree(tree, BASEDIR); status = torture_smb2_testdir(tree, BASEDIR, &testdirh); CHECK_STATUS(status, NT_STATUS_OK); smb2_util_close(tree, testdirh); - ret = torture_setup_local_file(tctx, "localdir", fname_local, - NULL, 0); - if (ret == false) { - goto done; - } + ret = torture_setup_file(tctx, tree, fname, false); + torture_assert_goto(tctx, ret == true, ret, done, + "torture_setup_file failed\n"); - ret = torture_setup_local_file(tctx, "localdir", adname_local, - osx_adouble_w_xattr, - sizeof(osx_adouble_w_xattr)); - if (ret == false) { - goto done; - } + ret = torture_setup_file(tctx, tree, adname, false); + torture_assert_goto(tctx, ret == true, ret, done, + "torture_setup_file failed\n"); + + ret = write_stream(tree, __location__, tctx, mem_ctx, + adname, NULL, + 0, sizeof(osx_adouble_w_xattr), osx_adouble_w_xattr); + torture_assert_goto(tctx, ret == true, ret, done, + "write_stream failed\n"); torture_comment(tctx, "(%s) test OS X AppleDouble conversion\n", __location__); -- 2.13.6 From 38956211620d94c18674bad665949565903f461b Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Fri, 17 Nov 2017 12:57:14 +0100 Subject: [PATCH 09/11] s4/torture: fruit: in test_adouble_conversion() also check stream list and AFPINFO_STREAM This reveals that the conversion doesn't work properly with fruit:metadata=stream. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 7b00b558761b6564928289efcf835e9b9cc86a89) --- selftest/knownfail.d/samba3.vfs.fruit | 1 + source4/torture/vfs/fruit.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/selftest/knownfail.d/samba3.vfs.fruit b/selftest/knownfail.d/samba3.vfs.fruit index 8df25bccb79..1b4894fcf85 100644 --- a/selftest/knownfail.d/samba3.vfs.fruit +++ b/selftest/knownfail.d/samba3.vfs.fruit @@ -1 +1,2 @@ ^samba3.vfs.fruit streams_depot.OS X AppleDouble file conversion\(nt4_dc\) +^samba3.vfs.fruit metadata_stream.OS X AppleDouble file conversion\(nt4_dc\) diff --git a/source4/torture/vfs/fruit.c b/source4/torture/vfs/fruit.c index 70e5c027928..04f04e2cd56 100644 --- a/source4/torture/vfs/fruit.c +++ b/source4/torture/vfs/fruit.c @@ -1959,6 +1959,13 @@ static bool test_adouble_conversion(struct torture_context *tctx, bool ret = true; const char *data = "This resource fork intentionally left blank"; size_t datalen = strlen(data); + const char *streams[] = { + "::$DATA", + AFPINFO_STREAM, + AFPRESOURCE_STREAM, + ":com.apple.metadata" "\xef\x80\xa2" "_kMDItemUserTags:$DATA", + ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */ + }; smb2_deltree(tree, BASEDIR); @@ -1989,12 +1996,21 @@ static bool test_adouble_conversion(struct torture_context *tctx, torture_assert_goto(tctx, ret == true, ret, done, "check AFPRESOURCE_STREAM failed\n"); + ret = check_stream(tree, __location__, tctx, mem_ctx, + fname, AFPINFO_STREAM, + 0, 60, 16, 8, "TESTSLOW"); + torture_assert_goto(tctx, ret == true, ret, done, + "check AFPINFO_STREAM failed\n"); + ret = check_stream(tree, __location__, tctx, mem_ctx, fname, ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */ 0, 3, 0, 3, "baz"); torture_assert_goto(tctx, ret == true, ret, done, "check foo:bar stream failed\n"); + ret = check_stream_list(tree, tctx, fname, 5, streams, false); + torture_assert_goto(tctx, ret == true, ret, done, "check_stream_list"); + done: smb2_deltree(tree, BASEDIR); talloc_free(mem_ctx); -- 2.13.6 From 6dac52fd3d5fed6179b5259c89766ec781e83ec9 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 15 Nov 2017 16:52:16 +0100 Subject: [PATCH 10/11] vfs_fruit: add AfpInfo prototypes Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 84976cb670847f199598995d48bd9c3f3dd0f035) --- source3/modules/vfs_fruit.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index 0f320dc6e40..501d16bcfd3 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -481,6 +481,10 @@ static int ad_fset(struct adouble *ad, files_struct *fsp); static int adouble_path(TALLOC_CTX *ctx, const struct smb_filename *smb_fname__in, struct smb_filename **ppsmb_fname_out); +static AfpInfo *afpinfo_new(TALLOC_CTX *ctx); +static ssize_t afpinfo_pack(const AfpInfo *ai, char *buf); +static AfpInfo *afpinfo_unpack(TALLOC_CTX *ctx, const void *data); + /** * Return a pointer to an AppleDouble entry -- 2.13.6 From 4059cf98fa5894038a83fd0caeb0e1f6598317b8 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 15 Nov 2017 16:52:48 +0100 Subject: [PATCH 11/11] vfs_fruit: proper VFS-stackable conversion of FinderInfo This fixes the problem that conversion failed with fruit:metadata=stream. Before we were calling ad_set() which stores the metadata in the Netatalk compatible format. Rewrite to fully go through the VFS by calling SMB_VFS_CREATE_FILE() and SMB_VFS_PWRITE(). Bug: https://bugzilla.samba.org/show_bug.cgi?id=13155 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Wed Nov 29 08:38:06 CET 2017 on sn-devel-144 (cherry picked from commit 1da17204344a99a3bfa289355a996027a21814b8) --- selftest/knownfail.d/samba3.vfs.fruit | 1 - source3/modules/vfs_fruit.c | 89 +++++++++++++++++++++++++++++------ 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/selftest/knownfail.d/samba3.vfs.fruit b/selftest/knownfail.d/samba3.vfs.fruit index 1b4894fcf85..8df25bccb79 100644 --- a/selftest/knownfail.d/samba3.vfs.fruit +++ b/selftest/knownfail.d/samba3.vfs.fruit @@ -1,2 +1 @@ ^samba3.vfs.fruit streams_depot.OS X AppleDouble file conversion\(nt4_dc\) -^samba3.vfs.fruit metadata_stream.OS X AppleDouble file conversion\(nt4_dc\) diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index 501d16bcfd3..8c3870b3495 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -1299,12 +1299,17 @@ static ssize_t ad_read_rsrc_xattr(struct adouble *ad) static ssize_t ad_read_rsrc_adouble(struct adouble *ad, const struct smb_filename *smb_fname) { - struct adouble *meta_ad = NULL; SMB_STRUCT_STAT sbuf; char *p_ad = NULL; - char *p_meta_ad = NULL; + AfpInfo *ai = NULL; + DATA_BLOB aiblob; + struct smb_filename *stream_name = NULL; + files_struct *fsp = NULL; ssize_t len; size_t size; + ssize_t nwritten; + NTSTATUS status; + int saved_errno = 0; int ret; bool ok; @@ -1389,29 +1394,85 @@ static ssize_t ad_read_rsrc_adouble(struct adouble *ad, return -1; } - meta_ad = ad_init(talloc_tos(), ad->ad_handle, ADOUBLE_META); - if (meta_ad == NULL) { + p_ad = ad_get_entry(ad, ADEID_FINDERI); + if (p_ad == NULL) { return -1; } - p_ad = ad_get_entry(ad, ADEID_FINDERI); - if (p_ad == NULL) { - TALLOC_FREE(meta_ad); + ai = afpinfo_new(talloc_tos()); + if (ai == NULL) { return -1; } - p_meta_ad = ad_get_entry(meta_ad, ADEID_FINDERI); - if (p_meta_ad == NULL) { - TALLOC_FREE(meta_ad); + + memcpy(ai->afpi_FinderInfo, p_ad, ADEDLEN_FINDERI); + + aiblob = data_blob_talloc(talloc_tos(), NULL, AFP_INFO_SIZE); + if (aiblob.data == NULL) { + TALLOC_FREE(ai); return -1; } - memcpy(p_meta_ad, p_ad, ADEDLEN_FINDERI); + size = afpinfo_pack(ai, (char *)aiblob.data); + TALLOC_FREE(ai); + if (size != AFP_INFO_SIZE) { + return -1; + } - ret = ad_set(meta_ad, smb_fname); - TALLOC_FREE(meta_ad); - if (ret != 0) { + stream_name = synthetic_smb_fname(talloc_tos(), + smb_fname->base_name, + AFPINFO_STREAM, + NULL, + smb_fname->flags); + if (stream_name == NULL) { + data_blob_free(&aiblob); + DBG_ERR("synthetic_smb_fname failed\n"); + return -1; + } + + DBG_DEBUG("stream_name: %s\n", smb_fname_str_dbg(stream_name)); + + status = SMB_VFS_CREATE_FILE( + ad->ad_handle->conn, /* conn */ + NULL, /* req */ + 0, /* root_dir_fid */ + stream_name, /* fname */ + FILE_GENERIC_WRITE, /* access_mask */ + FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */ + FILE_OPEN_IF, /* create_disposition */ + 0, /* create_options */ + 0, /* file_attributes */ + INTERNAL_OPEN_ONLY, /* oplock_request */ + NULL, /* lease */ + 0, /* allocation_size */ + 0, /* private_flags */ + NULL, /* sd */ + NULL, /* ea_list */ + &fsp, /* result */ + NULL, /* psbuf */ + NULL, NULL); /* create context */ + TALLOC_FREE(stream_name); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("SMB_VFS_CREATE_FILE failed\n"); + return -1; + } + + nwritten = SMB_VFS_PWRITE(fsp, + aiblob.data, + aiblob.length, + 0); + if (nwritten == -1) { + DBG_ERR("SMB_VFS_PWRITE failed\n"); + saved_errno = errno; + close_file(NULL, fsp, ERROR_CLOSE); + errno = saved_errno; + return -1; + } + + status = close_file(NULL, fsp, NORMAL_CLOSE); + if (!NT_STATUS_IS_OK(status)) { return -1; } + fsp = NULL; return len; } -- 2.13.6