diff options
author | Stefan Metzmacher <metze@samba.org> | 2011-11-18 10:30:33 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2011-11-24 19:02:30 +0100 |
commit | 1a0ce02a238fb0384b0a05783a0e277613dd0cb0 (patch) | |
tree | 92cc0199ed78c9f4e0036093b9075304e73a0876 /libcli/smb | |
parent | 4d8e1517798577d55479629d01826583a02aa43a (diff) | |
download | samba-1a0ce02a238fb0384b0a05783a0e277613dd0cb0.tar.gz samba-1a0ce02a238fb0384b0a05783a0e277613dd0cb0.tar.bz2 samba-1a0ce02a238fb0384b0a05783a0e277613dd0cb0.zip |
smbXcli: also notify chained requests about broken connections
metze
Diffstat (limited to 'libcli/smb')
-rw-r--r-- | libcli/smb/smbXcli_base.c | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index ae14ad7daa..c2e628c342 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -606,29 +606,64 @@ void smbXcli_conn_disconnect(struct smbXcli_conn *conn, NTSTATUS status) while (talloc_array_length(conn->pending) > 0) { struct tevent_req *req; struct smbXcli_req_state *state; + struct tevent_req **chain; + size_t num_chained; + size_t i; req = conn->pending[0]; state = tevent_req_data(req, struct smbXcli_req_state); - /* - * We're dead. No point waiting for trans2 - * replies. - */ - state->smb1.mid = 0; + if (state->smb1.chained_requests == NULL) { + /* + * We're dead. No point waiting for trans2 + * replies. + */ + state->smb1.mid = 0; - smbXcli_req_unset_pending(req); + smbXcli_req_unset_pending(req); - if (NT_STATUS_IS_OK(status)) { - /* do not notify the callers */ + if (NT_STATUS_IS_OK(status)) { + /* do not notify the callers */ + continue; + } + + /* + * we need to defer the callback, because we may notify + * more then one caller. + */ + tevent_req_defer_callback(req, state->ev); + tevent_req_nterror(req, status); continue; } - /* - * we need to defer the callback, because we may notify more - * then one caller. - */ - tevent_req_defer_callback(req, state->ev); - tevent_req_nterror(req, status); + chain = talloc_move(conn, &state->smb1.chained_requests); + num_chained = talloc_array_length(chain); + + for (i=0; i<num_chained; i++) { + req = chain[i]; + state = tevent_req_data(req, struct smbXcli_req_state); + + /* + * We're dead. No point waiting for trans2 + * replies. + */ + state->smb1.mid = 0; + + smbXcli_req_unset_pending(req); + + if (NT_STATUS_IS_OK(status)) { + /* do not notify the callers */ + continue; + } + + /* + * we need to defer the callback, because we may notify + * more then one caller. + */ + tevent_req_defer_callback(req, state->ev); + tevent_req_nterror(req, status); + } + TALLOC_FREE(chain); } } |