The branch, master has been updated via 11f25834203 s3:smbd: fix max_buffer handling of initial notify requests via 12fb3ec1dd8 s4:torture/smb2: replace torture:cn_max_buffer_size option with the negotiated max trans size via d6fce7c0cb1 s4:torture/smb2/notify: make use of torture_setup_simple_file() in test_valid_request() via 4ffb517ffd9 s4:torture/smb2: add smb2_create_simple_file() and torture_setup_simple_file() via e6fa76b651d s4:libcli/smb2: calculate the correct credit charge in smb2_notify_send() via 5a07c294814 s4:libcli/smb2: calculate the correct credit charge in smb2_ioctl_send() via 97b4e6e220d s4:libcli/smb2: align struct smb_ioctl.smb2 to [MS-SMB2] names via c88c2bf3b54 s4:libcli/smb2: calculate the correct credit charge in smb2_getinfo_send() via ee2574ae567 s4:libcli/smb2: fix smb2_getinfo_send() marshalling via 829f692fb15 smb2_server: grant all 8192 credits to clients via 4d6cd932a95 vfs_default: fix vfswrap_offload_write_send() NT_STATUS_INVALID_VIEW_SIZE check via 2abf9e9a95c vfs_default: fix DEBUG messages in vfswrap_offload_write_*_done() via 1dc00254833 smb2_tcon: avoid STATUS_PENDING completely on tdis via d64038425f2 smb2_sesssetup: avoid STATUS_PENDING completely on session logoff via 8a11da429bd smb2_tcon: avoid STATUS_PENDING responses for tree connect via 23792449694 smb2_sesssetup: avoid STATUS_PENDING responses for session setup via 4760b85243f smb2_server: allow smbd_smb2_request_pending_queue(0) to avoid STATUS_PENDING via 827dd0145b7 smb2_ioctl_network_fs: remove unused fsctl_srv_copychunk_state->aapl_copyfile via 1d934857591 s3:smbd: handle IO_REPARSE_TAG_DFS in SMB_FIND_FILE_FULL_DIRECTORY_INFO via 4c6156eddd1 s3:smbd: fix SAFE_FREE() vs. TALLOC_FREE() in list_sessions() via 7dbd8e441f7 s3:smb2_write: add missing initialization of state->in_offset via 6171a7fffd3 s4:torture/smb2: test_notify_tcp_dis trigger idle event every 0.25s via 7a091aa982a s4:torture/raw: test_notify_tcp_dis trigger idle event every 0.25s via 8dea0718f20 s4:libcli/smb2: don't schedule idle handlers on a dead connection via c2761b00570 s4:libcli/raw: don't schedule idle handlers on a dead connection from c68d9c9ef36 vfs_snapper: drop unneeded fstat handler
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 11f2583420310e0278188935f31be3131eb85fd4 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Jan 16 21:29:51 2019 +0100 s3:smbd: fix max_buffer handling of initial notify requests The max_buffer value is only evaluated on the first notify request on a directory handle. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13864 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Fri Mar 29 00:35:39 UTC 2019 on sn-devel-144 commit 12fb3ec1dd886c15977ae9eb0b2b25f2017db10d Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jan 8 16:22:25 2019 +0100 s4:torture/smb2: replace torture:cn_max_buffer_size option with the negotiated max trans size Both: smbtorture //w2012r2-188/torture -Ua%b smb2.notify.valid-req --smb-ports=139 and: smbtorture //w2012r2-188/torture -Ua%b smb2.notify.valid-req --smb-ports=445 work against Windows 2008R2, 2012R2 and 2016 now and it reflects what we have implemented in Samba. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13864 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d6fce7c0cb126e4ac79bceda77a50c4d65c093fd Author: Stefan Metzmacher <me...@samba.org> Date: Fri Feb 15 15:30:29 2019 +0100 s4:torture/smb2/notify: make use of torture_setup_simple_file() in test_valid_request() There's no reason to use torture_setup_complex_file(), when we want to test notify code. The test pass fine against Samba this way and don't fail because of unrelated timestamp behavior. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13864 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4ffb517ffd9cee0ad433e3f58f659f8445fa2166 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Feb 12 16:51:20 2019 +0100 s4:torture/smb2: add smb2_create_simple_file() and torture_setup_simple_file() Instead of the *_complex_file() versions these don't use EA's nor complex timestamps. A lot of tests currently using *_complex_file() only fail because smbd doesn't implement the correct 'change_time' update behavior. That should not be the reason why all smb2 related tests fail. Timestamps should be tested in dedicated tests. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13864 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit e6fa76b651de6a3046ca9c44926343a5225772d6 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jan 8 10:10:49 2019 +0100 s4:libcli/smb2: calculate the correct credit charge in smb2_notify_send() BUG: https://bugzilla.samba.org/show_bug.cgi?id=13863 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5a07c2948146c23d6a907fcd6ce63f67f36a5ded Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jan 8 16:13:41 2019 +0100 s4:libcli/smb2: calculate the correct credit charge in smb2_ioctl_send() BUG: https://bugzilla.samba.org/show_bug.cgi?id=13863 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 97b4e6e220dc3f0b9d7c3f50ef3b867ff2f0b755 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jan 8 15:52:35 2019 +0100 s4:libcli/smb2: align struct smb_ioctl.smb2 to [MS-SMB2] names BUG: https://bugzilla.samba.org/show_bug.cgi?id=13863 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c88c2bf3b54a0faf8a77daf9b8827c101db9be95 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jan 8 16:11:15 2019 +0100 s4:libcli/smb2: calculate the correct credit charge in smb2_getinfo_send() BUG: https://bugzilla.samba.org/show_bug.cgi?id=13863 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ee2574ae5675ef0ea9b14c13677acf6c003497e0 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jan 8 16:09:46 2019 +0100 s4:libcli/smb2: fix smb2_getinfo_send() marshalling BUG: https://bugzilla.samba.org/show_bug.cgi?id=13863 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 829f692fb1552e56c6a9726036a995b4328731dd Author: Stefan Metzmacher <me...@samba.org> Date: Wed Jan 16 12:24:04 2019 +0100 smb2_server: grant all 8192 credits to clients This seems to match Windows Server 2016. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13863 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4d6cd932a955a99ca33cc4aedd7f612e56e0b1de Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jul 31 12:29:29 2018 +0200 vfs_default: fix vfswrap_offload_write_send() NT_STATUS_INVALID_VIEW_SIZE check This fixes a regression introduced in commit 60e45a2d25401eaf9a15a86d19114670ccfde259, where the 'num' variable was renamed to 'to_copy', but a new 'num' variable was introduced. Note that off_t is signed! In future we need to watch out for filesystems supporting FMODE_UNSIGNED_OFFSET on Linux. Which means they use it unsigned. This is more or less a theoretical problem, The NT_STATUS_INVALID_PARAMETER cases are catched before by SMB_VFS_PREAD_SEND/RECV. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13862 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2abf9e9a95cbdf76109b3501dee3e0c34ad09194 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Mar 27 12:43:32 2019 +0100 vfs_default: fix DEBUG messages in vfswrap_offload_write_*_done() SMB_VFS_{PREAD,PWRITE}_RECV() don't set errno, so we need to use strerror(aio_state.error) in the debug messages. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13862 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1dc002548336b969979c3bf85b531c059d87f015 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Feb 12 08:27:43 2019 +0100 smb2_tcon: avoid STATUS_PENDING completely on tdis BUG: https://bugzilla.samba.org/show_bug.cgi?id=10344 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13698 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d64038425f250e253dce707d69899c7a5d8cb32e Author: Stefan Metzmacher <me...@samba.org> Date: Tue Feb 12 08:27:43 2019 +0100 smb2_sesssetup: avoid STATUS_PENDING completely on session logoff BUG: https://bugzilla.samba.org/show_bug.cgi?id=10344 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13698 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 8a11da429bd3c89766f43c2bff681837a769987c Author: Stefan Metzmacher <me...@samba.org> Date: Thu Jan 24 09:10:11 2019 +0100 smb2_tcon: avoid STATUS_PENDING responses for tree connect BUG: https://bugzilla.samba.org/show_bug.cgi?id=12844 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13698 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 23792449694b5221f6ea422166c96fac494e3e2c Author: Stefan Metzmacher <me...@samba.org> Date: Thu Jan 24 09:10:11 2019 +0100 smb2_sesssetup: avoid STATUS_PENDING responses for session setup BUG: https://bugzilla.samba.org/show_bug.cgi?id=12845 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13698 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13796 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4760b85243f335bb2094fc779802ce4b52db0ccb Author: Stefan Metzmacher <me...@samba.org> Date: Tue Feb 12 08:08:38 2019 +0100 smb2_server: allow smbd_smb2_request_pending_queue(0) to avoid STATUS_PENDING This has the same meaning as smb2_request_set_async_internal(), but this will simplifies callers. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13698 BUG: https://bugzilla.samba.org/show_bug.cgi?id=13796 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 827dd0145b78dcd01189f0608938b6a5d6f6fe12 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Jul 31 12:29:29 2018 +0200 smb2_ioctl_network_fs: remove unused fsctl_srv_copychunk_state->aapl_copyfile This is not used since commit 74e018f476608429caa1c3594102485ccc17afce. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 1d9348575914891dbb5638bc9b8d51eda98fe554 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Oct 9 12:06:29 2017 +0200 s3:smbd: handle IO_REPARSE_TAG_DFS in SMB_FIND_FILE_FULL_DIRECTORY_INFO This completes commit 74829fecd7a4e806ee441cd75141bede2eefef1a, which missed SMB_FIND_FILE_FULL_DIRECTORY_INFO BUG: https://bugzilla.samba.org/show_bug.cgi?id=10097 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4c6156eddd1ce38ef7c23b0eab300da9badf3f4e Author: Stefan Metzmacher <me...@samba.org> Date: Tue Nov 28 08:16:03 2017 +0100 s3:smbd: fix SAFE_FREE() vs. TALLOC_FREE() in list_sessions() It's very unlikely that sessionid_traverse_read() fails, but we should not segfault. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7dbd8e441f74e839cfbf32ed3ac61958195761d3 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Oct 5 15:59:23 2017 +0200 s3:smb2_write: add missing initialization of state->in_offset This is just used in DEBUG messages, but still confusing. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 6171a7fffd3268990c28d61cd48f2aacef428573 Author: Stefan Metzmacher <me...@samba.org> Date: Sun Feb 17 22:45:32 2013 +0100 s4:torture/smb2: test_notify_tcp_dis trigger idle event every 0.25s This is 1000 times longer than before and is less likely to change the timing behavior when running under valgrind. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 7a091aa982a662f804dc41fccbeda501f370347a Author: Stefan Metzmacher <me...@samba.org> Date: Sun Feb 17 22:43:49 2013 +0100 s4:torture/raw: test_notify_tcp_dis trigger idle event every 0.25s This is 1000 times longer than before and is less likely to change the timing behavior when running under valgrind. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 8dea0718f20f41031bc09851f07b09dcacf437c3 Author: Stefan Metzmacher <me...@samba.org> Date: Sun Feb 17 22:41:00 2013 +0100 s4:libcli/smb2: don't schedule idle handlers on a dead connection Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c2761b00570b0b1753dd226859a8534db1221c7c Author: Stefan Metzmacher <me...@samba.org> Date: Sun Feb 17 22:39:40 2013 +0100 s4:libcli/raw: don't schedule idle handlers on a dead connection Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: selftest/knownfail | 4 --- source3/modules/vfs_default.c | 47 +++++++++++++++++++++++++++++------ source3/smbd/notify.c | 11 +++++++-- source3/smbd/nttrans.c | 6 +++-- source3/smbd/proto.h | 4 ++- source3/smbd/session.c | 4 +-- source3/smbd/smb2_ioctl_network_fs.c | 1 - source3/smbd/smb2_notify.c | 1 + source3/smbd/smb2_server.c | 19 +++++++++----- source3/smbd/smb2_sesssetup.c | 17 ++++++++++--- source3/smbd/smb2_tcon.c | 12 ++++++--- source3/smbd/smb2_write.c | 1 + source3/smbd/trans2.c | 6 +++-- source4/libcli/raw/clitransport.c | 17 +++++++++++++ source4/libcli/raw/interfaces.h | 15 +++++------ source4/libcli/smb2/getinfo.c | 25 +++++++++++++++---- source4/libcli/smb2/ioctl.c | 21 ++++++++++++---- source4/libcli/smb2/notify.c | 2 ++ source4/libcli/smb2/smb2_calls.h | 8 +++--- source4/libcli/smb2/transport.c | 17 +++++++++++++ source4/ntvfs/ipc/vfs_ipc.c | 8 +++--- source4/smb_server/smb2/fileinfo.c | 2 +- source4/smb_server/smb2/fileio.c | 15 +++++------ source4/torture/raw/notify.c | 2 +- source4/torture/rpc/fsrvp.c | 4 +-- source4/torture/smb2/compound.c | 8 +++--- source4/torture/smb2/ioctl.c | 48 ++++++++++++++++++------------------ source4/torture/smb2/lock.c | 2 +- source4/torture/smb2/notify.c | 20 +++++++-------- source4/torture/smb2/replay.c | 4 +-- source4/torture/smb2/session.c | 2 +- source4/torture/smb2/util.c | 34 +++++++++++++++++++++++++ source4/torture/smbtorture.c | 2 -- source4/torture/smbtorture.h | 8 ------ source4/torture/vfs/fruit.c | 4 +-- 35 files changed, 275 insertions(+), 126 deletions(-) Changeset truncated at 500 lines: diff --git a/selftest/knownfail b/selftest/knownfail index fad4daf6c86..c588f2f5c6b 100644 --- a/selftest/knownfail +++ b/selftest/knownfail @@ -169,7 +169,6 @@ ^samba3.smb2.create.gentest ^samba3.smb2.create.blob ^samba3.smb2.create.open -^samba3.smb2.notify.valid-req ^samba3.smb2.notify.rec ^samba3.smb2.durable-open.delete_on_close2 ^samba3.smb2.durable-v2-open.app-instance @@ -342,9 +341,6 @@ ^samba.tests.dcerpc.dnsserver.python2.samba.tests.dcerpc.dnsserver.DnsserverTests.test_add_duplicate_different_type.* ^samba.tests.dcerpc.dnsserver.python2.samba.tests.dcerpc.dnsserver.DnsserverTests.test_rank_none.* ^samba.tests.dcerpc.dnsserver.python2.samba.tests.dcerpc.dnsserver.DnsserverTests.test_security_descriptor.* -^samba3.smb2.credits.session_setup_credits_granted.* -^samba3.smb2.credits.single_req_credits_granted.* -^samba3.smb2.credits.skipped_mid.* ^samba4.blackbox.dbcheck-links.release-4-5-0-pre1.dbcheck_dangling_multi_valued_clean ^samba4.blackbox.dbcheck-links.release-4-5-0-pre1.dangling_multi_valued_check_missing # diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index bed581e96d1..47722d53cec 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -1802,6 +1802,8 @@ static struct tevent_req *vfswrap_offload_write_send( { struct tevent_req *req; struct vfswrap_offload_write_state *state = NULL; + /* off_t is signed! */ + off_t max_offset = INT64_MAX - to_copy; size_t num = MIN(to_copy, COPYCHUNK_MAX_TOTAL_LEN); files_struct *src_fsp = NULL; NTSTATUS status; @@ -1853,6 +1855,35 @@ static struct tevent_req *vfswrap_offload_write_send( return tevent_req_post(req, ev); } + if (state->src_off > max_offset) { + /* + * Protect integer checks below. + */ + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } + if (state->src_off < 0) { + /* + * Protect integer checks below. + */ + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } + if (state->dst_off > max_offset) { + /* + * Protect integer checks below. + */ + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } + if (state->dst_off < 0) { + /* + * Protect integer checks below. + */ + tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER); + return tevent_req_post(req, ev); + } + status = vfs_offload_token_db_fetch_fsp(vfswrap_offload_ctx, token, &src_fsp); if (tevent_req_nterror(req, status)) { @@ -1876,17 +1907,12 @@ static struct tevent_req *vfswrap_offload_write_send( state->src_ev = src_fsp->conn->sconn->ev_ctx; state->src_fsp = src_fsp; - state->buf = talloc_array(state, uint8_t, num); - if (tevent_req_nomem(state->buf, req)) { - return tevent_req_post(req, ev); - } - status = vfs_stat_fsp(src_fsp); if (tevent_req_nterror(req, status)) { return tevent_req_post(req, ev); } - if (src_fsp->fsp_name->st.st_ex_size < state->src_off + num) { + if (src_fsp->fsp_name->st.st_ex_size < state->src_off + to_copy) { /* * [MS-SMB2] 3.3.5.15.6 Handling a Server-Side Data Copy Request * If the SourceOffset or SourceOffset + Length extends beyond @@ -1900,6 +1926,11 @@ static struct tevent_req *vfswrap_offload_write_send( return tevent_req_post(req, ev); } + state->buf = talloc_array(state, uint8_t, num); + if (tevent_req_nomem(state->buf, req)) { + return tevent_req_post(req, ev); + } + status = vfswrap_offload_write_loop(req); if (!NT_STATUS_IS_OK(status)) { tevent_req_nterror(req, status); @@ -1969,7 +2000,7 @@ static void vfswrap_offload_write_read_done(struct tevent_req *subreq) nread = SMB_VFS_PREAD_RECV(subreq, &aio_state); TALLOC_FREE(subreq); if (nread == -1) { - DBG_ERR("read failed: %s\n", strerror(errno)); + DBG_ERR("read failed: %s\n", strerror(aio_state.error)); tevent_req_nterror(req, map_nt_error_from_unix(aio_state.error)); return; } @@ -2030,7 +2061,7 @@ static void vfswrap_offload_write_write_done(struct tevent_req *subreq) nwritten = SMB_VFS_PWRITE_RECV(subreq, &aio_state); TALLOC_FREE(subreq); if (nwritten == -1) { - DBG_ERR("write failed: %s\n", strerror(errno)); + DBG_ERR("write failed: %s\n", strerror(aio_state.error)); tevent_req_nterror(req, map_nt_error_from_unix(aio_state.error)); return; } diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 44c0b09432e..bf3fff7b97d 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -43,6 +43,8 @@ struct notify_change_buf { * we only append. */ + uint32_t max_buffer_size; + /* * num_changes == -1 means that we have got a catch-all change, when * asked we just return NT_STATUS_OK without specific changes. @@ -224,11 +226,13 @@ void change_notify_reply(struct smb_request *req, return; } - if (max_param == 0 || notify_buf == NULL) { + if (notify_buf == NULL) { reply_fn(req, NT_STATUS_OK, NULL, 0); return; } + max_param = MIN(max_param, notify_buf->max_buffer_size); + if (!notify_marshall_changes(notify_buf->num_changes, max_param, notify_buf->changes, &blob)) { /* @@ -276,7 +280,9 @@ void notify_callback(struct smbd_server_connection *sconn, files_forall(sconn, notify_fsp_cb, &state); } -NTSTATUS change_notify_create(struct files_struct *fsp, uint32_t filter, +NTSTATUS change_notify_create(struct files_struct *fsp, + uint32_t max_buffer_size, + uint32_t filter, bool recursive) { size_t len = fsp_fullbasepath(fsp, NULL, 0); @@ -295,6 +301,7 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32_t filter, } fsp->notify->filter = filter; fsp->notify->subdir_filter = recursive ? filter : 0; + fsp->notify->max_buffer_size = max_buffer_size; fsp_fullbasepath(fsp, fullpath, sizeof(fullpath)); diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 7ebd802109f..8bb121a1351 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1806,8 +1806,10 @@ static void call_nt_transact_notify_change(connection_struct *conn, if (fsp->notify == NULL) { - status = change_notify_create(fsp, filter, recursive); - + status = change_notify_create(fsp, + max_param_count, + filter, + recursive); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("change_notify_create returned %s\n", nt_errstr(status))); diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 3662a925dd6..fdb0ffabf75 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -542,7 +542,9 @@ void change_notify_reply(struct smb_request *req, void notify_callback(struct smbd_server_connection *sconn, void *private_data, struct timespec when, const struct notify_event *e); -NTSTATUS change_notify_create(struct files_struct *fsp, uint32_t filter, +NTSTATUS change_notify_create(struct files_struct *fsp, + uint32_t max_buffer_size, + uint32_t filter, bool recursive); NTSTATUS change_notify_add_request(struct smb_request *req, uint32_t max_param, diff --git a/source3/smbd/session.c b/source3/smbd/session.c index 8b4c6609304..abc799105f0 100644 --- a/source3/smbd/session.c +++ b/source3/smbd/session.c @@ -179,8 +179,8 @@ int list_sessions(TALLOC_CTX *mem_ctx, struct sessionid **session_list) status = sessionid_traverse_read(gather_sessioninfo, (void *) &sesslist); if (!NT_STATUS_IS_OK(status)) { - DEBUG(3, ("Session traverse failed\n")); - SAFE_FREE(sesslist.sessions); + DBG_ERR("Session traverse failed: %s\n", nt_errstr(status)); + TALLOC_FREE(sesslist.sessions); *session_list = NULL; return 0; } diff --git a/source3/smbd/smb2_ioctl_network_fs.c b/source3/smbd/smb2_ioctl_network_fs.c index c0d175609ec..8154fa3f92e 100644 --- a/source3/smbd/smb2_ioctl_network_fs.c +++ b/source3/smbd/smb2_ioctl_network_fs.c @@ -94,7 +94,6 @@ struct fsctl_srv_copychunk_state { COPYCHUNK_OUT_LIMITS, COPYCHUNK_OUT_RSP, } out_data; - bool aapl_copyfile; }; static void fsctl_srv_copychunk_vfs_done(struct tevent_req *subreq); diff --git a/source3/smbd/smb2_notify.c b/source3/smbd/smb2_notify.c index 24241562556..68429b7b766 100644 --- a/source3/smbd/smb2_notify.c +++ b/source3/smbd/smb2_notify.c @@ -263,6 +263,7 @@ static struct tevent_req *smbd_smb2_notify_send(TALLOC_CTX *mem_ctx, if (fsp->notify == NULL) { status = change_notify_create(fsp, + in_output_buffer_length, in_completion_filter, recursive); if (!NT_STATUS_IS_OK(status)) { diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c index 1e9ed331aa6..956c5f0ca09 100644 --- a/source3/smbd/smb2_server.c +++ b/source3/smbd/smb2_server.c @@ -829,8 +829,11 @@ static void smb2_set_operation_credit(struct smbXsrv_connection *xconn, * of requests and the used sequence number. * Which means we would grant more credits * for client which use multi credit requests. + * + * The above is what Windows Server < 2016 is doing, + * but new servers use all credits (8192 by default). */ - current_max_credits = xconn->smb2.credits.max / 16; + current_max_credits = xconn->smb2.credits.max; current_max_credits = MAX(current_max_credits, 1); if (xconn->smb2.credits.multicredit) { @@ -875,15 +878,19 @@ static void smb2_set_operation_credit(struct smbXsrv_connection *xconn, * with a successful session setup */ if (NT_STATUS_IS_OK(out_status)) { - additional_max = 32; + additional_max = xconn->smb2.credits.max; } break; default: /* - * We match windows and only grant additional credits - * in chunks of 32. + * Windows Server < 2016 and older Samba versions + * used to only grant additional credits in + * chunks of 32 credits. + * + * But we match Windows Server 2016 and grant + * all credits as requested. */ - additional_max = 32; + additional_max = xconn->smb2.credits.max; break; } @@ -1391,7 +1398,7 @@ NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req, return NT_STATUS_OK; } - if (req->async_internal) { + if (req->async_internal || defer_time == 0) { /* * An SMB2 request implementation wants to handle the request * asynchronously "internally" while keeping synchronous diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c index d34951a4eef..9591a8823dd 100644 --- a/source3/smbd/smb2_sesssetup.c +++ b/source3/smbd/smb2_sesssetup.c @@ -107,7 +107,16 @@ NTSTATUS smbd_smb2_request_process_sesssetup(struct smbd_smb2_request *smb2req) } tevent_req_set_callback(subreq, smbd_smb2_request_sesssetup_done, smb2req); - return smbd_smb2_request_pending_queue(smb2req, subreq, 500); + /* + * Avoid sending a STATUS_PENDING message, which + * matches a Windows Server and avoids problems with + * MacOS clients. + * + * Even after 90 seconds a Windows Server doesn't return + * STATUS_PENDING if using NTLMSSP against a non reachable + * trusted domain. + */ + return smbd_smb2_request_pending_queue(smb2req, subreq, 0); } static void smbd_smb2_request_sesssetup_done(struct tevent_req *subreq) @@ -1250,10 +1259,10 @@ NTSTATUS smbd_smb2_request_process_logoff(struct smbd_smb2_request *req) tevent_req_set_callback(subreq, smbd_smb2_request_logoff_done, req); /* - * Wait a long time before going async on this to allow - * requests we're waiting on to finish. Set timeout to 10 secs. + * Avoid sending a STATUS_PENDING message, it's very likely + * the client won't expect that. */ - return smbd_smb2_request_pending_queue(req, subreq, 10000000); + return smbd_smb2_request_pending_queue(req, subreq, 0); } static void smbd_smb2_request_logoff_done(struct tevent_req *subreq) diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c index ebd31602efc..c2a5cbc39aa 100644 --- a/source3/smbd/smb2_tcon.c +++ b/source3/smbd/smb2_tcon.c @@ -102,7 +102,11 @@ NTSTATUS smbd_smb2_request_process_tcon(struct smbd_smb2_request *req) } tevent_req_set_callback(subreq, smbd_smb2_request_tcon_done, req); - return smbd_smb2_request_pending_queue(req, subreq, 500); + /* + * Avoid sending a STATUS_PENDING message, it's very likely + * the client won't expect that. + */ + return smbd_smb2_request_pending_queue(req, subreq, 0); } static void smbd_smb2_request_tcon_done(struct tevent_req *subreq) @@ -498,10 +502,10 @@ NTSTATUS smbd_smb2_request_process_tdis(struct smbd_smb2_request *req) tevent_req_set_callback(subreq, smbd_smb2_request_tdis_done, req); /* - * Wait a long time before going async on this to allow - * requests we're waiting on to finish. Set timeout to 10 secs. + * Avoid sending a STATUS_PENDING message, it's very likely + * the client won't expect that. */ - return smbd_smb2_request_pending_queue(req, subreq, 10000000); + return smbd_smb2_request_pending_queue(req, subreq, 0); } static void smbd_smb2_request_tdis_done(struct tevent_req *subreq) diff --git a/source3/smbd/smb2_write.c b/source3/smbd/smb2_write.c index ee95bd317ae..e49e623d796 100644 --- a/source3/smbd/smb2_write.c +++ b/source3/smbd/smb2_write.c @@ -287,6 +287,7 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx, state->write_through = true; } state->in_length = in_data.length; + state->in_offset = in_offset; state->out_count = 0; DEBUG(10,("smbd_smb2_write: %s - %s\n", diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index dd5973b089b..017ad068877 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -2109,12 +2109,14 @@ static NTSTATUS smbd_marshall_dir_entry(TALLOC_CTX *ctx, SOFF_T(p,0,allocation_size); p += 8; SIVAL(p,0,mode); p += 4; q = p; p += 4; /* q is placeholder for name length. */ - { + if (mode & FILE_ATTRIBUTE_REPARSE_POINT) { + SIVAL(p, 0, IO_REPARSE_TAG_DFS); + } else { unsigned int ea_size = estimate_ea_size(conn, NULL, smb_fname); SIVAL(p,0,ea_size); /* Extended attributes */ - p +=4; } + p +=4; status = srvstr_push(base_data, flags2, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE_ASCII, &len); diff --git a/source4/libcli/raw/clitransport.c b/source4/libcli/raw/clitransport.c index 47b8dbf3ae7..26e9dee401d 100644 --- a/source4/libcli/raw/clitransport.c +++ b/source4/libcli/raw/clitransport.c @@ -181,6 +181,14 @@ static void idle_handler(struct tevent_context *ev, transport->idle.func(transport, transport->idle.private_data); + if (transport->idle.func == NULL) { + return; + } + + if (!smbXcli_conn_is_connected(transport->conn)) { + return; + } + next = timeval_current_ofs_usec(transport->idle.period); transport->idle.te = tevent_add_timer(transport->ev, @@ -200,6 +208,15 @@ _PUBLIC_ void smbcli_transport_idle_handler(struct smbcli_transport *transport, void *private_data) { TALLOC_FREE(transport->idle.te); + ZERO_STRUCT(transport->idle); + + if (idle_func == NULL) { + return; + } + + if (!smbXcli_conn_is_connected(transport->conn)) { + return; + } transport->idle.func = idle_func; transport->idle.private_data = private_data; diff --git a/source4/libcli/raw/interfaces.h b/source4/libcli/raw/interfaces.h index 43a53f834df..d44c451f650 100644 --- a/source4/libcli/raw/interfaces.h +++ b/source4/libcli/raw/interfaces.h @@ -2291,16 +2291,17 @@ union smb_ioctl { /* static body buffer 56 (0x38) bytes */ /* uint16_t buffer_code; 0x39 = 0x38 + 1 */ - uint16_t _pad; + uint16_t reserved; uint32_t function; /*struct smb2_handle handle;*/ /* uint32_t out_ofs; */ /* uint32_t out_size; */ - uint32_t unknown2; + uint32_t max_input_response; /* uint32_t in_ofs; */ /* uint32_t in_size; */ - uint32_t max_response_size; - uint64_t flags; + uint32_t max_output_response; + uint32_t flags; + uint32_t reserved2; /* dynamic body */ DATA_BLOB out; @@ -2311,15 +2312,15 @@ union smb_ioctl { /* static body buffer 48 (0x30) bytes */ /* uint16_t buffer_code; 0x31 = 0x30 + 1 */ - uint16_t _pad; + uint16_t reserved; uint32_t function; /* struct smb2_handle handle; */ /* uint32_t in_ofs; */ /* uint32_t in_size; */ /* uint32_t out_ofs; */ /* uint32_t out_size; */ - uint32_t unknown2; - uint32_t unknown3; + uint32_t flags; + uint32_t reserved2; /* dynamic body */ DATA_BLOB in; diff --git a/source4/libcli/smb2/getinfo.c b/source4/libcli/smb2/getinfo.c index 14d911683e7..7a8fd44a855 100644 --- a/source4/libcli/smb2/getinfo.c +++ b/source4/libcli/smb2/getinfo.c @@ -32,26 +32,41 @@ struct smb2_request *smb2_getinfo_send(struct smb2_tree *tree, struct smb2_getin { struct smb2_request *req; NTSTATUS status; + size_t max_payload; req = smb2_request_init_tree(tree, SMB2_OP_GETINFO, 0x28, true, - io->in.blob.length); + io->in.input_buffer.length); if (req == NULL) return NULL; SCVAL(req->out.body, 0x02, io->in.info_type); SCVAL(req->out.body, 0x03, io->in.info_class); SIVAL(req->out.body, 0x04, io->in.output_buffer_length); - SIVAL(req->out.body, 0x0C, io->in.reserved); - SIVAL(req->out.body, 0x08, io->in.input_buffer_length); + /* + * uint16_t input_buffer_offset + * uint16_t reserved + * uint32_t input_buffer_length + * + * We use smb2_push_o32s32_blob() which would + * expect uint32_t offset, uint32_t length. + * + * Everything is little endian, we can just + * overwrite the reserved field later. + */ SIVAL(req->out.body, 0x10, io->in.additional_information); -- Samba Shared Repository