You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by su...@apache.org on 2014/09/12 19:08:18 UTC

git commit: [TS-2938] - Fix core dump in 307 redirect follow handling

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 <su...@yahoo-inc.com>
Authored: Fri Sep 12 17:07:50 2014 +0000
Committer: Sudheer Vinukonda <su...@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 {