Repository: trafficserver Updated Branches: refs/heads/master ecf790630 -> 1736377ce
[TS-2938] - Fix core dump in 307 redirect follow handling Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/1736377c Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/1736377c Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/1736377c Branch: refs/heads/master Commit: 1736377ce48d51ac29bd4e76ddb626b6e9ed95ea Parents: ecf7906 Author: Sudheer Vinukonda <sudhe...@yahoo-inc.com> Authored: Fri Sep 12 17:07:50 2014 +0000 Committer: Sudheer Vinukonda <sudhe...@yahoo-inc.com> Committed: Fri Sep 12 17:07:50 2014 +0000 ---------------------------------------------------------------------- proxy/http/HttpSM.cc | 51 +++++++++++++++++++++++------------------ proxy/http/HttpTransact.cc | 1 + 2 files changed, 30 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1736377c/proxy/http/HttpSM.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index 1813380..1e20072 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -7421,6 +7421,35 @@ HttpSM::redirect_request(const char *redirect_url, const int redirect_len) return; } + bool valid_origHost = true; + int origHost_len, origMethod_len; + char origHost[MAXDNAME]; + char origMethod[255]; + int origPort = 80; + + if(t_state.hdr_info.server_request.valid()) { + + origPort = t_state.hdr_info.server_request.port_get(); + + char* tmpOrigHost = (char *) t_state.hdr_info.server_request.value_get(MIME_FIELD_HOST, MIME_LEN_HOST, &origHost_len); + if (tmpOrigHost) { + memcpy(origHost, tmpOrigHost, origHost_len); + origHost[origHost_len] = '\0'; + } else { + valid_origHost = false; + } + + char *tmpOrigMethod = (char *) t_state.hdr_info.server_request.method_get(&origMethod_len); + if (tmpOrigMethod) { + memcpy(origMethod, tmpOrigMethod, origMethod_len); + } else { + valid_origHost = false; + } + } else { + DebugSM("http_redir_error", "t_state.hdr_info.server_request not valid"); + valid_origHost = false; + } + t_state.redirect_info.redirect_in_process = true; // set the passed in location url and parse it @@ -7450,28 +7479,6 @@ HttpSM::redirect_request(const char *redirect_url, const int redirect_len) t_state.hdr_info.client_response.destroy(); } - - bool valid_origHost = true; - int origHost_len, origMethod_len; - char* tmpOrigHost = (char *) t_state.hdr_info.server_request.value_get(MIME_FIELD_HOST, MIME_LEN_HOST, &origHost_len); - char origHost[origHost_len + 1]; - - if (tmpOrigHost) - memcpy(origHost, tmpOrigHost, origHost_len); - else - valid_origHost = false; - - origHost[origHost_len] = '\0'; - int origPort = t_state.hdr_info.server_request.port_get(); - - char *tmpOrigMethod = (char *) t_state.hdr_info.server_request.method_get(&origMethod_len); - char origMethod[origMethod_len + 1]; - - if (tmpOrigMethod) - memcpy(origMethod, tmpOrigMethod, origMethod_len); - else - valid_origHost = false; - int scheme = t_state.next_hop_scheme; int scheme_len = hdrtoken_index_to_length(scheme); const char* next_hop_scheme = hdrtoken_index_to_wks(scheme); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1736377c/proxy/http/HttpTransact.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc index 2c6f81a..22906d8 100644 --- a/proxy/http/HttpTransact.cc +++ b/proxy/http/HttpTransact.cc @@ -2981,6 +2981,7 @@ HttpTransact::handle_cache_write_lock(State* s) } if (s->cache_info.write_lock_state == CACHE_WL_READ_RETRY) { + DebugTxn("http_error", "calling hdr_info.server_request.destroy"); s->hdr_info.server_request.destroy(); HandleCacheOpenReadHitFreshness(s); } else {