From fbf17489844a5cfc6d1da8c431ce0194ed4c3f72 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 18 Oct 2011 21:36:44 +0200 Subject: [PATCH] s3: Avoid a winbind 100% cpu loop When a DC goes down hard, winbind can end up in a 100% CPU loop. The next (small) RPC request to the DC ends up as a trans2 request. If the connection goes down, we end up trying to discard the request via the loop in cli_state_notify_pending(). Because this is a trans2 request, cli_smb_req_unset_pending will not kick in. Thus the pending array will always remain at length 1. Autobuild-User: Volker Lendecke Autobuild-Date: Wed Oct 19 01:39:35 CEST 2011 on sn-devel-104 --- source3/libsmb/async_smb.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c index efeb328dd93..dce1b74f888 100644 --- a/source3/libsmb/async_smb.c +++ b/source3/libsmb/async_smb.c @@ -287,6 +287,14 @@ static void cli_state_notify_pending(struct cli_state *cli, NTSTATUS status) req = cli->conn.pending[0]; state = tevent_req_data(req, struct cli_smb_state); + if (NT_STATUS_EQUAL(status, NT_STATUS_PIPE_BROKEN)) { + /* + * We're dead. No point waiting for trans2 + * replies. + */ + state->mid = 0; + } + cli_smb_req_unset_pending(req); /* -- 2.34.1