Repository: trafficserver Updated Branches: refs/heads/master 0c18f7bcd -> c9d443353
TS-2780: Core dump in SpdyRequest::clear() in production testing of SPDY Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/c9d44335 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/c9d44335 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/c9d44335 Branch: refs/heads/master Commit: c9d4433531767c9b5f6db42b488af4552bc5c4a9 Parents: 0c18f7b Author: Sudheer Vinukonda <[email protected]> Authored: Tue Jul 8 12:28:57 2014 -0700 Committer: Bryan Call <[email protected]> Committed: Tue Jul 8 12:28:57 2014 -0700 ---------------------------------------------------------------------- proxy/spdy/SpdyCallbacks.cc | 10 ++++++---- proxy/spdy/SpdyClientSession.cc | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c9d44335/proxy/spdy/SpdyCallbacks.cc ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyCallbacks.cc b/proxy/spdy/SpdyCallbacks.cc index 5a0564f..830c336 100644 --- a/proxy/spdy/SpdyCallbacks.cc +++ b/proxy/spdy/SpdyCallbacks.cc @@ -372,12 +372,13 @@ spdy_on_data_chunk_recv_callback(spdylay_session * /*session*/, uint8_t /*flags* size_t len, void *user_data) { SpdyClientSession *sm = (SpdyClientSession *)user_data; - SpdyRequest *req = sm->req_map[stream_id]; + SpdyRequest *req = NULL; + map<int32_t, SpdyRequest*>::iterator iter = sm->req_map.find(stream_id); // // SpdyRequest has been deleted on error, drop this data; // - if (!req) + if ((iter == sm->req_map.end()) || ((req=iter->second) == NULL)) return; Debug("spdy", "++++Fetcher Append Data, len:%zu", len); @@ -391,7 +392,8 @@ spdy_on_data_recv_callback(spdylay_session *session, uint8_t flags, int32_t stream_id, int32_t length, void *user_data) { SpdyClientSession *sm = (SpdyClientSession *)user_data; - SpdyRequest *req = sm->req_map[stream_id]; + SpdyRequest *req = NULL; + map<int32_t, SpdyRequest*>::iterator iter = sm->req_map.find(stream_id); spdy_show_data_frame("++++RECV", session, flags, stream_id, length, user_data); @@ -400,7 +402,7 @@ spdy_on_data_recv_callback(spdylay_session *session, uint8_t flags, // client might continue to send POST data, We should reenable // sm->write_vio so that WINDOW_UPDATE has a chance to be sent. // - if (!req) { + if ((iter == sm->req_map.end()) || ((req=iter->second) == NULL)) { TSVIOReenable(sm->write_vio); return; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c9d44335/proxy/spdy/SpdyClientSession.cc ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyClientSession.cc b/proxy/spdy/SpdyClientSession.cc index 6367e67..f816ba9 100644 --- a/proxy/spdy/SpdyClientSession.cc +++ b/proxy/spdy/SpdyClientSession.cc @@ -378,11 +378,12 @@ spdy_read_fetch_body_callback(spdylay_session * /*session*/, int32_t stream_id, SpdyClientSession *sm = (SpdyClientSession *)user_data; SpdyRequest *req = (SpdyRequest *)source->ptr; + map<int32_t, SpdyRequest*>::iterator iter = sm->req_map.find(stream_id); // // req has been deleted, ignore this data. // - if (req != sm->req_map[stream_id]) { + if ((iter == sm->req_map.end()) || (req != iter->second)) { Debug("spdy", " stream_id:%d, call:%d, req has been deleted, return 0", stream_id, g_call_cnt); *eof = 1;
