The branch, master has been updated via 6ea1af287ee smbd: Simplify symlink_target_below_conn() via f31fb6e1ad0 smbd: Simplify readlink_talloc() via 453f846e189 smbd: No dfs_filename_convert() in filename_convert_smb1_search_path() via 71772c48f24 libsmb: Remove sync cli_posix_readlink() wrapper via a7f4ed09084 smbclient: Use cli_readlink via f17131020ec libsmb: Make readlink issue posix_readlink via 4be2569c002 smbd: Fix a comment via a1a0a7119d7 smbd: Slightly simplify smb_posix_unlink() via 0996ccdb821 tests: Test error codes for SET_REPARSE_POINT via 96580c8e195 tests: Try setting a 0-sized reparse point via b58f5f3379a tests: Ignore symlink trusts flags in symlink error returns via ec86c377238 pylibsmb: Add symlink flags via 7239d756290 lib: Add symlink trust flags from dochelp via f10f259eaeb tests: Fix use of self.assertRaises() via 73233bc341e tests: Show that we can write to a reparse point file via 62302849dd9 tests: Show that a directory with a reparse point can't be populated via 7fe3fab655e tests: IO_REPARSE_TAG_NOT_HANDLED is acceptable for unlink from ef8c8ac54cd s3:utils: Fix stack smashing in net offlinejoin
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 6ea1af287eef832641464c6f764ea84a484a06f7 Author: Volker Lendecke <v...@samba.org> Date: Sun Dec 4 12:16:39 2022 +0100 smbd: Simplify symlink_target_below_conn() readlink_talloc() deals exactly the same way with a NULL relname Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Mon Dec 5 16:06:51 UTC 2022 on sn-devel-184 commit f31fb6e1ad0664fdba351822ec754c0d1b771657 Author: Volker Lendecke <v...@samba.org> Date: Sun Dec 4 12:14:12 2022 +0100 smbd: Simplify readlink_talloc() SMB_VFS_READLINKAT() just looks at the basename, we can avoid the relname being talloc'ed Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 453f846e1897f7cbcc454f3095eb21d7ffb32be8 Author: Volker Lendecke <v...@samba.org> Date: Mon Oct 24 19:56:31 2022 +0200 smbd: No dfs_filename_convert() in filename_convert_smb1_search_path() We further down call filename_convert_dirfsp(), which also has this call. No need to copy that code here as well. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 71772c48f241bdc048f99f297b5e0a77fdfda253 Author: Volker Lendecke <v...@samba.org> Date: Sun Dec 4 11:07:09 2022 +0100 libsmb: Remove sync cli_posix_readlink() wrapper cli_readlink() now covers smb1 posix extensions as well Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit a7f4ed090845023069693412033da803edc32a31 Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 12 20:38:14 2022 +0200 smbclient: Use cli_readlink Make smbclient's readlink command also work for SMB2 reparse style symlink. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit f17131020ec23c5b88f56b4c8f4dfd4d3e88d6a2 Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 12 20:35:10 2022 +0200 libsmb: Make readlink issue posix_readlink Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 4be2569c002a8d592e08b0f1fb8b85154082e4a5 Author: Volker Lendecke <v...@samba.org> Date: Tue Oct 11 17:01:28 2022 +0200 smbd: Fix a comment Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit a1a0a7119d746b884de43db6466b9e064d124a87 Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 12 07:27:36 2022 +0200 smbd: Slightly simplify smb_posix_unlink() We did check VALID_STAT() above. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 0996ccdb821692f037eb1f6f2c01490aa7ab062e Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 2 10:34:55 2022 +0100 tests: Test error codes for SET_REPARSE_POINT Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit 96580c8e1957776a8564fc73363f30259827a686 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 2 10:20:06 2022 +0100 tests: Try setting a 0-sized reparse point Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit b58f5f3379abac496d27f6afc0e31c8b874aa851 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 2 10:17:15 2022 +0100 tests: Ignore symlink trusts flags in symlink error returns Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit ec86c377238ccc4e00b36ed3c9fe203a19a8139b Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 2 10:10:12 2022 +0100 pylibsmb: Add symlink flags Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit 7239d756290292f5056ea0235630e8413ef5960f Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 2 10:06:31 2022 +0100 lib: Add symlink trust flags from dochelp Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit f10f259eaebdb98f5e0827482e98f5abeb65e55c Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 2 09:26:56 2022 +0100 tests: Fix use of self.assertRaises() The with statement creates a new variable. I thought it opens a block where "e" is only valid in that block. But instead it runs the whole thing, expecting an exception somewhere. Learning python.... Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit 73233bc341e0dfe6cb61a638707567e79e639b28 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 1 15:14:03 2022 +0100 tests: Show that we can write to a reparse point file Works against Windows 2016 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit 62302849dd9477a46684462db4106664d8d787e9 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 1 14:49:37 2022 +0100 tests: Show that a directory with a reparse point can't be populated Works against Windows 2016 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> commit 7fe3fab655e92d8906f196d7984a2cd99e8462c1 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 1 14:48:46 2022 +0100 tests: IO_REPARSE_TAG_NOT_HANDLED is acceptable for unlink This happens when a path has an unknown reparse point in the middle Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> ----------------------------------------------------------------------- Summary of changes: libcli/smb/smb_constants.h | 11 +++++ python/samba/tests/reparsepoints.py | 84 ++++++++++++++++++++++++++++++++++--- python/samba/tests/smb2symlink.py | 56 +++++++++++++++---------- source3/client/client.c | 16 ++----- source3/libsmb/clifile.c | 42 ------------------- source3/libsmb/clisymlink.c | 47 +++++++++++++++++++++ source3/libsmb/proto.h | 5 --- source3/libsmb/pylibsmb.c | 7 ++++ source3/smbd/filename.c | 23 ---------- source3/smbd/files.c | 10 ++--- source3/smbd/open.c | 16 +++---- source3/smbd/smb2_trans2.c | 2 +- source3/torture/test_posix.c | 11 +++-- source3/torture/torture.c | 2 +- 14 files changed, 202 insertions(+), 130 deletions(-) Changeset truncated at 500 lines: diff --git a/libcli/smb/smb_constants.h b/libcli/smb/smb_constants.h index 876ea63f2b9..a08b1931277 100644 --- a/libcli/smb/smb_constants.h +++ b/libcli/smb/smb_constants.h @@ -624,4 +624,15 @@ enum csc_policy { */ #define SYMLINK_ERROR_TAG 0x4C4D5953 +/* + * Flags according to answer from Dochelp: + * https://lists.samba.org/archive/cifs-protocol/2022-November/003909.html + */ +#define SYMLINK_ADMIN 0x20000000 /* The symlink creator is an admin */ +#define SYMLINK_UNTRUSTED 0x10000000 /* The symlink creator is untrusted */ +#define SYMLINK_TRUST_UNKNOWN 0x00000000 /* The symlink creator is unknown/legacy */ + +#define SYMLINK_TRUST_MASK 0x30000000 /* Encodes the redirection trust level (maps to REDIRECTION_TRUST_LEVEL) */ +#define SYMLINK_TRUST_SHIFT 28 /* Bits to shift to convert to/from REDIRECTION_TRUST_LEVEL */ + #endif /* _SMB_CONSTANTS_H */ diff --git a/python/samba/tests/reparsepoints.py b/python/samba/tests/reparsepoints.py index 07abdb03975..95c41d18525 100644 --- a/python/samba/tests/reparsepoints.py +++ b/python/samba/tests/reparsepoints.py @@ -41,6 +41,7 @@ class ReparsePoints(samba.tests.libsmb.LibsmbTests): err = e.args[0] ok = (err == ntstatus.NT_STATUS_OBJECT_NAME_NOT_FOUND) ok |= (err == ntstatus.NT_STATUS_OBJECT_PATH_NOT_FOUND) + ok |= (err == ntstatus.NT_STATUS_IO_REPARSE_TAG_NOT_HANDLED) if not ok: raise @@ -56,7 +57,9 @@ class ReparsePoints(samba.tests.libsmb.LibsmbTests): with self.assertRaises(NTSTATUSError) as e: conn.fsctl(fd, libsmb.FSCTL_GET_REPARSE_POINT, b'', 1024) - self.assertEqual(e.args[0], ntstatus.NT_STATUS_NOT_A_REPARSE_POINT) + + self.assertEqual(e.exception.args[0], + ntstatus.NT_STATUS_NOT_A_REPARSE_POINT) conn.close(fd) @@ -71,28 +74,97 @@ class ReparsePoints(samba.tests.libsmb.LibsmbTests): filename, DesiredAccess=sec.SEC_FILE_WRITE_ATTRIBUTE, CreateDisposition=libsmb.FILE_CREATE) + + with self.assertRaises(NTSTATUSError) as e: + conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b'', 0) + + self.assertEqual(e.exception.args[0], + ntstatus.NT_STATUS_INVALID_BUFFER_SIZE) + + for i in range(1,15): + with self.assertRaises(NTSTATUSError) as e: + conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, i * b'0', 0) + + self.assertEqual(e.exception.args[0], + ntstatus.NT_STATUS_IO_REPARSE_DATA_INVALID) + + # Create a syntactically valid [MS-FSCC] 2.1.2.2 REPARSE_DATA_BUFFER b = reparse_symlink.put(0x80000025, 0, b'asdfasdfasdfasdfasdfasdf') + + # Show that SET_REPARSE_POINT does exact length checks + + with self.assertRaises(NTSTATUSError) as e: + conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b + b'0', 0) + self.assertEqual(e.exception.args[0], + ntstatus.NT_STATUS_IO_REPARSE_DATA_INVALID) + + with self.assertRaises(NTSTATUSError) as e: + conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b[:-1], 0) + self.assertEqual(e.exception.args[0], + ntstatus.NT_STATUS_IO_REPARSE_DATA_INVALID) + conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b, 0) b = reparse_symlink.put(0x80000026, 0, b'asdfasdfasdfasdfasdfasdf') conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b, 0) + # Show that we can write to a reparse point when opened properly + def test_write_reparse(self): + conn = self.connection() + filename = 'reparse' + self.clean_file(conn, filename) + + fd = conn.create( + filename, + DesiredAccess=sec.SEC_FILE_WRITE_ATTRIBUTE, + CreateDisposition=libsmb.FILE_CREATE) + b = reparse_symlink.put(0x80000025, 0, b'asdfasdfasdfasdfasdfasdf') + conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b, 0) + conn.close(fd); + + fd,cr,_ = conn.create_ex( + filename, + DesiredAccess=sec.SEC_FILE_WRITE_DATA|sec.SEC_STD_DELETE, + CreateOptions=libsmb.FILE_OPEN_REPARSE_POINT, + CreateDisposition=libsmb.FILE_OPEN) + self.assertEqual( + cr['file_attributes'] & libsmb.FILE_ATTRIBUTE_REPARSE_POINT, + libsmb.FILE_ATTRIBUTE_REPARSE_POINT) + + conn.write(fd, b'x', 1) + + conn.delete_on_close(fd, 1) + conn.close(fd); + # Show that directories can carry reparse points def test_create_reparse_directory(self): conn = self.connection() dirname = "reparse_dir" + filename = f'{dirname}\\file.txt' + self.clean_file(conn, filename) self.clean_file(conn, dirname) - fd = conn.create( + dir_fd = conn.create( dirname, DesiredAccess=sec.SEC_FILE_WRITE_ATTRIBUTE| sec.SEC_STD_DELETE, CreateDisposition=libsmb.FILE_CREATE, CreateOptions=libsmb.FILE_DIRECTORY_FILE) b = reparse_symlink.put(0x80000025, 0, b'asdfasdfasdfasdfasdfasdf') - conn.fsctl(fd, libsmb.FSCTL_SET_REPARSE_POINT, b, 0) - conn.delete_on_close(fd, 1) + conn.fsctl(dir_fd, libsmb.FSCTL_SET_REPARSE_POINT, b, 0) + + with self.assertRaises(NTSTATUSError) as e: + fd = conn.create( + filename, + DesiredAccess=sec.SEC_STD_DELETE, + CreateDisposition=libsmb.FILE_CREATE) + + self.assertEqual(e.exception.args[0], + ntstatus.NT_STATUS_IO_REPARSE_TAG_NOT_HANDLED) + + conn.delete_on_close(dir_fd, 1) + conn.close(dir_fd); # Only empty directories can carry reparse points @@ -157,7 +229,9 @@ class ReparsePoints(samba.tests.libsmb.LibsmbTests): DesiredAccess=sec.SEC_FILE_READ_DATA, CreateDisposition=libsmb.FILE_OPEN, CreateOptions=libsmb.FILE_OPEN_REPARSE_POINT) - self.assertEqual(e.args[0], ntstatus.NT_STATUS_SHARING_VIOLATION) + + self.assertEqual(e.exception.args[0], + ntstatus.NT_STATUS_SHARING_VIOLATION) conn.delete_on_close(fd1, 1); conn.close(fd1) diff --git a/python/samba/tests/smb2symlink.py b/python/samba/tests/smb2symlink.py index e918ade45bb..14f6056ac15 100644 --- a/python/samba/tests/smb2symlink.py +++ b/python/samba/tests/smb2symlink.py @@ -78,7 +78,13 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): def assert_symlink_exception(self, e, expect): self.assertEqual(e.args[0], ntstatus.NT_STATUS_STOPPED_ON_SYMLINK) for k,v in expect.items(): - self.assertEqual((k,e.args[2].get(k)), (k,v)) + if (k == "flags"): + # Ignore symlink trust flags for now + expected = v & ~libsmb.SYMLINK_TRUST_MASK + got = e.args[2].get(k) & ~libsmb.SYMLINK_TRUST_MASK + self.assertEqual((k,got), (k,expected)) + else: + self.assertEqual((k,e.args[2].get(k)), (k,v)) def test_symlinkerror_directory(self): """Test a symlink in a nonterminal path component""" @@ -91,11 +97,13 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}\\{suffix}') - self.assert_symlink_exception( - e, { 'unparsed_path_length' : len(suffix)+1, - 'substitute_name' : target, - 'print_name' : target, - 'flags' : 0x20000001 }) + + self.assert_symlink_exception( + e.exception, + { 'unparsed_path_length' : len(suffix)+1, + 'substitute_name' : target, + 'print_name' : target, + 'flags' : 0x20000001 }) self.clean_file(smb1, symlink) @@ -109,11 +117,13 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}') - self.assert_symlink_exception( - e, { 'unparsed_path_length' : 0, - 'substitute_name' : target, - 'print_name' : target, - 'flags' : 0x20000001 }) + + self.assert_symlink_exception( + e.exception, + { 'unparsed_path_length' : 0, + 'substitute_name' : target, + 'print_name' : target, + 'flags' : 0x20000001 }) self.clean_file(smb1, symlink) @@ -131,11 +141,13 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}') - self.assert_symlink_exception( - e, { 'unparsed_path_length' : 0, - 'substitute_name' : target, - 'print_name' : target, - 'flags' : 0 }) + + self.assert_symlink_exception( + e.exception, + { 'unparsed_path_length' : 0, + 'substitute_name' : target, + 'print_name' : target, + 'flags' : 0 }) self.clean_file(smb1, symlink) @@ -153,11 +165,13 @@ class Smb2SymlinkTests(samba.tests.libsmb.LibsmbTests): with self.assertRaises(NTSTATUSError) as e: fd = smb2.create_ex(f'{symlink}') - self.assert_symlink_exception( - e, { 'unparsed_path_length' : 0, - 'substitute_name' : rel_dest, - 'print_name' : rel_dest, - 'flags' : 0 }) + + self.assert_symlink_exception( + e.exception, + { 'unparsed_path_length' : 0, + 'substitute_name' : rel_dest, + 'print_name' : rel_dest, + 'flags' : 0 }) self.clean_file(smb1, symlink) diff --git a/source3/client/client.c b/source3/client/client.c index 651da5fbf7a..f7719db118b 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -3455,6 +3455,8 @@ static int cmd_readlink(void) char *buf = NULL; char *targetname = NULL; char *linkname = NULL; + char *printname = NULL; + uint32_t flags; struct cli_state *targetcli; struct cli_credentials *creds = samba_cmdline_get_creds(); NTSTATUS status; @@ -3483,18 +3485,8 @@ static int cmd_readlink(void) return 1; } - if (!SERVER_HAS_UNIX_CIFS(targetcli)) { - d_printf("Server doesn't support UNIX CIFS calls.\n"); - return 1; - } - - if (CLI_DIRSEP_CHAR != '/') { - d_printf("Command \"posix\" must be issued before " - "the \"readlink\" command can be used.\n"); - return 1; - } - - status = cli_posix_readlink(targetcli, name, talloc_tos(), &linkname); + status = cli_readlink( + cli, name, talloc_tos(), &linkname, &printname, &flags); if (!NT_STATUS_IS_OK(status)) { d_printf("%s readlink on file %s\n", nt_errstr(status), name); diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index 31776a58621..91bb1095643 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -482,48 +482,6 @@ NTSTATUS cli_posix_readlink_recv( return NT_STATUS_OK; } -NTSTATUS cli_posix_readlink( - struct cli_state *cli, - const char *fname, - TALLOC_CTX *mem_ctx, - char **target) -{ - TALLOC_CTX *frame = talloc_stackframe(); - struct tevent_context *ev = NULL; - struct tevent_req *req = NULL; - NTSTATUS status = NT_STATUS_OK; - - if (smbXcli_conn_has_async_calls(cli->conn)) { - /* - * Can't use sync call while an async call is in flight - */ - status = NT_STATUS_INVALID_PARAMETER; - goto fail; - } - - ev = samba_tevent_context_init(frame); - if (ev == NULL) { - status = NT_STATUS_NO_MEMORY; - goto fail; - } - - req = cli_posix_readlink_send(frame, ev, cli, fname); - if (req == NULL) { - status = NT_STATUS_NO_MEMORY; - goto fail; - } - - if (!tevent_req_poll_ntstatus(req, ev, &status)) { - goto fail; - } - - status = cli_posix_readlink_recv(req, mem_ctx, target); - - fail: - TALLOC_FREE(frame); - return status; -} - /**************************************************************************** Hard link a file (UNIX extensions). ****************************************************************************/ diff --git a/source3/libsmb/clisymlink.c b/source3/libsmb/clisymlink.c index f77f2c050ab..12d644eb68d 100644 --- a/source3/libsmb/clisymlink.c +++ b/source3/libsmb/clisymlink.c @@ -228,8 +228,10 @@ struct cli_readlink_state { NTSTATUS get_reparse_status; uint8_t *data; uint32_t num_data; + char *target; }; +static void cli_readlink_posix1_done(struct tevent_req *subreq); static void cli_readlink_opened(struct tevent_req *subreq); static void cli_readlink_got_reparse_data(struct tevent_req *subreq); static void cli_readlink_closed(struct tevent_req *subreq); @@ -249,6 +251,18 @@ struct tevent_req *cli_readlink_send(TALLOC_CTX *mem_ctx, state->ev = ev; state->cli = cli; + if (cli->requested_posix_capabilities != 0) { + /* + * Only happens for negotiated SMB1 posix caps + */ + subreq = cli_posix_readlink_send(state, ev, cli, fname); + if (tevent_req_nomem(subreq, req)) { + return tevent_req_post(req, ev); + } + tevent_req_set_callback(subreq, cli_readlink_posix1_done, req); + return req; + } + subreq = cli_ntcreate_send( state, ev, cli, fname, 0, FILE_READ_ATTRIBUTES | FILE_READ_EA, 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, @@ -261,6 +275,22 @@ struct tevent_req *cli_readlink_send(TALLOC_CTX *mem_ctx, return req; } +static void cli_readlink_posix1_done(struct tevent_req *subreq) +{ + struct tevent_req *req = tevent_req_callback_data( + subreq, struct tevent_req); + struct cli_readlink_state *state = tevent_req_data( + req, struct cli_readlink_state); + NTSTATUS status; + + status = cli_posix_readlink_recv(subreq, state, &state->target); + TALLOC_FREE(subreq); + if (tevent_req_nterror(req, status)) { + return; + } + tevent_req_done(req); +} + static void cli_readlink_opened(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data( @@ -345,6 +375,23 @@ NTSTATUS cli_readlink_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, return status; } + if (state->target != NULL) { + /* + * SMB1 posix version + */ + if (psubstitute_name != NULL) { + *psubstitute_name = talloc_move( + mem_ctx, &state->target); + } + if (pprint_name != NULL) { + *pprint_name = NULL; + } + if (pflags != NULL) { + *pflags = 0; + } + return NT_STATUS_OK; + } + symlink = symlink_reparse_buffer_parse( talloc_tos(), state->data, state->num_data); if (symlink == NULL) { diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h index 58fb2cbbf18..3d732fe8524 100644 --- a/source3/libsmb/proto.h +++ b/source3/libsmb/proto.h @@ -266,11 +266,6 @@ struct tevent_req *cli_posix_readlink_send(TALLOC_CTX *mem_ctx, const char *fname); NTSTATUS cli_posix_readlink_recv( struct tevent_req *req, TALLOC_CTX *mem_ctx, char **target); -NTSTATUS cli_posix_readlink( - struct cli_state *cli, - const char *fname, - TALLOC_CTX *mem_ctx, - char **target); struct tevent_req *cli_posix_hardlink_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct cli_state *cli, diff --git a/source3/libsmb/pylibsmb.c b/source3/libsmb/pylibsmb.c index 3d8bb14bb78..0990e2dc995 100644 --- a/source3/libsmb/pylibsmb.c +++ b/source3/libsmb/pylibsmb.c @@ -2855,6 +2855,13 @@ MODULE_INIT_FUNC(libsmb_samba_cwrapper) ADD_FLAGS(FSCTL_LMR_SET_LINK_TRACKING_INFORMATION); ADD_FLAGS(FSCTL_QUERY_NETWORK_INTERFACE_INFO); + ADD_FLAGS(SYMLINK_ERROR_TAG); + ADD_FLAGS(SYMLINK_FLAG_RELATIVE); + ADD_FLAGS(SYMLINK_ADMIN); + ADD_FLAGS(SYMLINK_UNTRUSTED); + ADD_FLAGS(SYMLINK_TRUST_UNKNOWN); + ADD_FLAGS(SYMLINK_TRUST_MASK); + #define ADD_STRING(val) PyModule_AddObject(m, #val, PyBytes_FromString(val)) ADD_STRING(SMB2_CREATE_TAG_EXTA); diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 1f8b33c7fda..c66e8b4b24e 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -509,29 +509,6 @@ NTSTATUS filename_convert_smb1_search_path(TALLOC_CTX *ctx, ucf_flags &= ~UCF_GMT_PATHNAME; } - if (ucf_flags & UCF_DFS_PATHNAME) { - /* - * We've been given a raw DFS pathname. - */ - char *pathname = NULL; - DBG_DEBUG("Before dfs_filename_convert name_in: %s\n", name_in); - status = dfs_filename_convert(ctx, - conn, - ucf_flags, - name_in, - &pathname); - if (!NT_STATUS_IS_OK(status)) { - DBG_DEBUG("dfs_filename_convert " - "failed for name %s with %s\n", - name_in, - nt_errstr(status)); - return status; - } - ucf_flags &= ~UCF_DFS_PATHNAME; - name_in = pathname; - DBG_DEBUG("After dfs_filename_convert name_in: %s\n", name_in); - } - /* Get the original lcomp. */ mask = get_original_lcomp(ctx, conn, diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 40d71d8851b..1b486757506 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -685,6 +685,9 @@ NTSTATUS readlink_talloc( struct smb_filename *smb_relname, char **_substitute) { + struct smb_filename null_fname = { + .base_name = discard_const_p(char, ""), + }; char buf[PATH_MAX]; ssize_t ret; char *substitute; -- Samba Shared Repository