The branch, v4-8-test has been updated via c45c96e smbclient: Handle ENUM_DIR in "notify" command via 61470f6 libsmb: Handle IO_TIMEOUT in cli_smb2_notify properly via daf2c88 libsmb: Handle long-running smb2cli_notify via a25ec76 rpc_server: Init local_server_* in make_internal_rpc_pipe_socketpair via 9f3ab35 libads: Fix the build --without-ads from 7e01028 torture: Test compound request request counters
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-8-test - Log ----------------------------------------------------------------- commit c45c96e94ed052bb1bb8d27a1eadcd611ab7af4a Author: Volker Lendecke <v...@samba.org> Date: Mon Oct 30 16:15:03 2017 +0100 smbclient: Handle ENUM_DIR in "notify" command Bug: https://bugzilla.samba.org/show_bug.cgi?id=13382 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Thu Apr 5 04:05:52 CEST 2018 on sn-devel-144 (cherry picked from commit 1452677ef0044815df0702de5424d4711e18144b) Autobuild-User(v4-8-test): Karolin Seeger <ksee...@samba.org> Autobuild-Date(v4-8-test): Thu Apr 19 16:16:41 CEST 2018 on sn-devel-144 commit 61470f63f8c053f393070f6052f77fb0a9d7a4cc Author: Volker Lendecke <v...@samba.org> Date: Mon Oct 30 14:36:46 2017 +0100 libsmb: Handle IO_TIMEOUT in cli_smb2_notify properly Bug: https://bugzilla.samba.org/show_bug.cgi?id=13382 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit abfe482828e8c1dc233d67657a4d11a91a731f70) commit daf2c88a3fcc4b619da131c95595584bca80c345 Author: Volker Lendecke <v...@samba.org> Date: Mon Oct 30 14:34:12 2017 +0100 libsmb: Handle long-running smb2cli_notify This likely runs into a timeout. Properly cancel the smb2 request, allowing the higher-level caller to re-issue this request on an existing handle. I did not see a proper way to achieve this with tevent_req_set_endtime or something like that. Bug: https://bugzilla.samba.org/show_bug.cgi?id=13382 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> (cherry picked from commit 91c0f497816bb88d8935a8a79c146c08379ecf53) commit a25ec76b6118c722378548655c1862db9e1bca42 Author: Volker Lendecke <v...@samba.org> Date: Wed Apr 11 10:42:21 2018 +0200 rpc_server: Init local_server_* in make_internal_rpc_pipe_socketpair Bug: https://bugzilla.samba.org/show_bug.cgi?id=13370 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Wed Apr 11 15:19:19 CEST 2018 on sn-devel-144 (cherry picked from commit 212815969f4a706bc8395e2f6dbf225318ff2ad7) commit 9f3ab35a6243361de946a37f9b99af40b288d7cf Author: Volker Lendecke <v...@samba.org> Date: Sat Feb 3 07:07:24 2018 +0100 libads: Fix the build --without-ads Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: David Disseldorp <dd...@samba.org> Autobuild-User(master): David Disseldorp <dd...@samba.org> Autobuild-Date(master): Tue Feb 6 02:47:44 CET 2018 on sn-devel-144 Bug: https://bugzilla.samba.org/show_bug.cgi?id=13273 (cherry picked from commit 859698d29b547217356851094ed8188236e717b6) ----------------------------------------------------------------------- Summary of changes: libcli/smb/smb2cli_notify.c | 54 ++++++++++++++++++++++++++++++++------- source3/client/client.c | 9 +++++-- source3/libads/kerberos_keytab.c | 4 +++ source3/libsmb/cli_smb2_fnum.c | 9 +++++++ source3/rpc_server/rpc_ncacn_np.c | 31 ++++++++++++++++------ source3/rpc_server/rpc_ncacn_np.h | 18 +++++++------ source3/rpc_server/srv_pipe_hnd.c | 18 +++++++------ 7 files changed, 108 insertions(+), 35 deletions(-) Changeset truncated at 500 lines: diff --git a/libcli/smb/smb2cli_notify.c b/libcli/smb/smb2cli_notify.c index 0a23cf9..34329ba 100644 --- a/libcli/smb/smb2cli_notify.c +++ b/libcli/smb/smb2cli_notify.c @@ -30,9 +30,12 @@ struct smb2cli_notify_state { struct iovec *recv_iov; uint8_t *data; uint32_t data_length; + + struct tevent_req *subreq; }; static void smb2cli_notify_done(struct tevent_req *subreq); +static void smb2cli_notify_timedout(struct tevent_req *subreq); struct tevent_req *smb2cli_notify_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, @@ -64,21 +67,50 @@ struct tevent_req *smb2cli_notify_send(TALLOC_CTX *mem_ctx, SIVAL(fixed, 24, completion_filter); SIVAL(fixed, 28, 0); /* reserved */ - subreq = smb2cli_req_send(state, ev, conn, SMB2_OP_NOTIFY, - 0, 0, /* flags */ - timeout_msec, - tcon, - session, - state->fixed, sizeof(state->fixed), - NULL, 0, /* dyn* */ - 0); /* max_dyn_len */ + state->subreq = smb2cli_req_send(state, ev, conn, SMB2_OP_NOTIFY, + 0, 0, /* flags */ + 0, /* timeout_msec */ + tcon, + session, + state->fixed, sizeof(state->fixed), + NULL, 0, /* dyn* */ + 0); /* max_dyn_len */ + if (tevent_req_nomem(state->subreq, req)) { + return tevent_req_post(req, ev); + } + tevent_req_set_callback(state->subreq, smb2cli_notify_done, req); + + subreq = tevent_wakeup_send(state, ev, + timeval_current_ofs_msec(timeout_msec)); if (tevent_req_nomem(subreq, req)) { return tevent_req_post(req, ev); } - tevent_req_set_callback(subreq, smb2cli_notify_done, req); + tevent_req_set_callback(subreq, smb2cli_notify_timedout, req); + return req; } +static void smb2cli_notify_timedout(struct tevent_req *subreq) +{ + struct tevent_req *req = tevent_req_callback_data( + subreq, struct tevent_req); + struct smb2cli_notify_state *state = tevent_req_data( + req, struct smb2cli_notify_state); + bool ok; + + ok = tevent_wakeup_recv(subreq); + if (!ok) { + tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR); + return; + } + + ok = tevent_req_cancel(state->subreq); + if (!ok) { + tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR); + return; + } +} + static void smb2cli_notify_done(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data( @@ -98,6 +130,10 @@ static void smb2cli_notify_done(struct tevent_req *subreq) status = smb2cli_req_recv(subreq, state, &iov, expected, ARRAY_SIZE(expected)); TALLOC_FREE(subreq); + + if (NT_STATUS_EQUAL(status, NT_STATUS_CANCELLED)) { + status = NT_STATUS_IO_TIMEOUT; + } if (tevent_req_nterror(req, status)) { return; } diff --git a/source3/client/client.c b/source3/client/client.c index ad10a53..2c1c760 100644 --- a/source3/client/client.c +++ b/source3/client/client.c @@ -4561,12 +4561,17 @@ static int cmd_notify(void) } while (1) { - uint32_t i, num_changes; - struct notify_change *changes; + uint32_t i; + uint32_t num_changes = 0; + struct notify_change *changes = NULL; status = cli_notify(cli, fnum, 1000, FILE_NOTIFY_CHANGE_ALL, true, talloc_tos(), &num_changes, &changes); + if (NT_STATUS_EQUAL(status, STATUS_NOTIFY_ENUM_DIR)) { + printf("NOTIFY_ENUM_DIR\n"); + status = NT_STATUS_OK; + } if (!NT_STATUS_IS_OK(status)) { d_printf("notify returned %s\n", nt_errstr(status)); diff --git a/source3/libads/kerberos_keytab.c b/source3/libads/kerberos_keytab.c index ffd100c..37ac7ba 100644 --- a/source3/libads/kerberos_keytab.c +++ b/source3/libads/kerberos_keytab.c @@ -640,7 +640,11 @@ int ads_keytab_list(const char *keytab_name) } if (keytab_name == NULL) { +#ifdef HAVE_ADS ret = ads_keytab_open(context, &keytab); +#else + ret = ENOENT; +#endif } else { ret = smb_krb5_kt_open(context, keytab_name, False, &keytab); } diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index 2d87b58..c397b29 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -4192,6 +4192,15 @@ NTSTATUS cli_smb2_notify(struct cli_state *cli, uint16_t fnum, completion_filter, recursive, frame, &base, &len); + if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) { + len = 0; + status = NT_STATUS_OK; + } + + if (!NT_STATUS_IS_OK(status)) { + goto fail; + } + ofs = 0; while (len - ofs >= 12) { diff --git a/source3/rpc_server/rpc_ncacn_np.c b/source3/rpc_server/rpc_ncacn_np.c index 0728f54..d7e7785 100644 --- a/source3/rpc_server/rpc_ncacn_np.c +++ b/source3/rpc_server/rpc_ncacn_np.c @@ -69,14 +69,16 @@ fail: return NULL; } -NTSTATUS make_internal_rpc_pipe_socketpair(TALLOC_CTX *mem_ctx, - struct tevent_context *ev_ctx, - struct messaging_context *msg_ctx, - const char *pipe_name, - const struct ndr_syntax_id *syntax, - const struct tsocket_address *remote_address, - const struct auth_session_info *session_info, - struct npa_state **pnpa) +NTSTATUS make_internal_rpc_pipe_socketpair( + TALLOC_CTX *mem_ctx, + struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + const char *pipe_name, + const struct ndr_syntax_id *syntax, + const struct tsocket_address *remote_address, + const struct tsocket_address *local_address, + const struct auth_session_info *session_info, + struct npa_state **pnpa) { TALLOC_CTX *tmp_ctx = talloc_stackframe(); struct named_pipe_client *npc; @@ -136,6 +138,19 @@ NTSTATUS make_internal_rpc_pipe_socketpair(TALLOC_CTX *mem_ctx, goto out; } + npc->local_server_addr = tsocket_address_copy(local_address, npc); + if (npc->local_server_addr == NULL) { + status = NT_STATUS_NO_MEMORY; + goto out; + } + + npc->local_server_name = tsocket_address_inet_addr_string( + npc->local_server_addr, npc); + if (npc->local_server_name == NULL) { + status = NT_STATUS_NO_MEMORY; + goto out; + } + npc->session_info = copy_session_info(npc, session_info); if (npc->session_info == NULL) { status = NT_STATUS_NO_MEMORY; diff --git a/source3/rpc_server/rpc_ncacn_np.h b/source3/rpc_server/rpc_ncacn_np.h index 03bbd3f..9ba5864 100644 --- a/source3/rpc_server/rpc_ncacn_np.h +++ b/source3/rpc_server/rpc_ncacn_np.h @@ -44,14 +44,16 @@ NTSTATUS make_external_rpc_pipe(TALLOC_CTX *mem_ctx, const struct auth_session_info *session_info, struct npa_state **pnpa); -NTSTATUS make_internal_rpc_pipe_socketpair(TALLOC_CTX *mem_ctx, - struct tevent_context *ev_ctx, - struct messaging_context *msg_ctx, - const char *pipe_name, - const struct ndr_syntax_id *syntax, - const struct tsocket_address *remote_address, - const struct auth_session_info *session_info, - struct npa_state **pnpa); +NTSTATUS make_internal_rpc_pipe_socketpair( + TALLOC_CTX *mem_ctx, + struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + const char *pipe_name, + const struct ndr_syntax_id *syntax, + const struct tsocket_address *remote_address, + const struct tsocket_address *local_address, + const struct auth_session_info *session_info, + struct npa_state **pnpa); struct np_proxy_state { uint16_t file_type; diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c index f9b7855..baa4ce9 100644 --- a/source3/rpc_server/srv_pipe_hnd.c +++ b/source3/rpc_server/srv_pipe_hnd.c @@ -106,14 +106,16 @@ NTSTATUS np_open(TALLOC_CTX *mem_ctx, const char *name, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } - status = make_internal_rpc_pipe_socketpair(handle, - ev_ctx, - msg_ctx, - name, - &syntax, - remote_client_address, - session_info, - &npa); + status = make_internal_rpc_pipe_socketpair( + handle, + ev_ctx, + msg_ctx, + name, + &syntax, + remote_client_address, + local_server_address, + session_info, + &npa); if (!NT_STATUS_IS_OK(status)) { talloc_free(handle); return status; -- Samba Shared Repository