summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2011-10-18 21:36:44 +0200
committerVolker Lendecke <vlendec@samba.org>2011-10-19 01:39:35 +0200
commitfbf17489844a5cfc6d1da8c431ce0194ed4c3f72 (patch)
tree93f61ac4ca3ab0f0d9507b50f4ac83d88e2d784d
parent8d54bdb5e199b2198990ee8d572662a128506337 (diff)
downloadsamba-fbf17489844a5cfc6d1da8c431ce0194ed4c3f72.tar.gz
samba-fbf17489844a5cfc6d1da8c431ce0194ed4c3f72.tar.bz2
samba-fbf17489844a5cfc6d1da8c431ce0194ed4c3f72.zip
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 <vlendec@samba.org> Autobuild-Date: Wed Oct 19 01:39:35 CEST 2011 on sn-devel-104
-rw-r--r--source3/libsmb/async_smb.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c
index efeb328dd9..dce1b74f88 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);
/*