You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/09/28 18:51:48 UTC

svn commit: r1002261 - in /trafficserver/traffic/trunk: CHANGES proxy/hdrs/MIME.cc proxy/hdrs/MIME.h proxy/http2/HttpTransact.cc proxy/http2/HttpTransactHeaders.cc

Author: zwoop
Date: Tue Sep 28 16:51:47 2010
New Revision: 1002261

URL: http://svn.apache.org/viewvc?rev=1002261&view=rev
Log:
TS-470 Age: headers > INT_MAX should be capped to 2^31

Modified:
    trafficserver/traffic/trunk/CHANGES
    trafficserver/traffic/trunk/proxy/hdrs/MIME.cc
    trafficserver/traffic/trunk/proxy/hdrs/MIME.h
    trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc
    trafficserver/traffic/trunk/proxy/http2/HttpTransactHeaders.cc

Modified: trafficserver/traffic/trunk/CHANGES
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/CHANGES?rev=1002261&r1=1002260&r2=1002261&view=diff
==============================================================================
--- trafficserver/traffic/trunk/CHANGES (original)
+++ trafficserver/traffic/trunk/CHANGES Tue Sep 28 16:51:47 2010
@@ -2,6 +2,11 @@
 
 Changes with Apache Traffic Server 2.1.4
 
+  *) Better support for Age: headers, and avoiding overflows [TS-470].
+
+  *) Added a configure option to size the API stats "slots". The new
+  option is --with-max-api-stats=<n> [TS-454].
+
   *) In Cache.cc, make snprintf() around Debug statements conditional for
    performance [TS-459].
 

Modified: trafficserver/traffic/trunk/proxy/hdrs/MIME.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/hdrs/MIME.cc?rev=1002261&r1=1002260&r2=1002261&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/hdrs/MIME.cc (original)
+++ trafficserver/traffic/trunk/proxy/hdrs/MIME.cc Tue Sep 28 16:51:47 2010
@@ -3545,7 +3545,7 @@ mime_format_date(char *buffer, time_t va
 int32
 mime_parse_int(const char *buf, const char *end)
 {
-  int num;
+  int32 num;
   bool negative;
 
   if (!buf || (buf == end))
@@ -3586,7 +3586,7 @@ mime_parse_int(const char *buf, const ch
 uint32
 mime_parse_uint(const char *buf, const char *end)
 {
-  unsigned int num;
+  uint32 num;
 
   if (!buf || (buf == end))
     return 0;

Modified: trafficserver/traffic/trunk/proxy/hdrs/MIME.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/hdrs/MIME.h?rev=1002261&r1=1002260&r2=1002261&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/hdrs/MIME.h (original)
+++ trafficserver/traffic/trunk/proxy/hdrs/MIME.h Tue Sep 28 16:51:47 2010
@@ -912,7 +912,7 @@ public:
   // Other separators (e.g. ';' in Set-cookie/Cookie) are also possible
   void field_value_append(MIMEField * field,
                           const char *value, int value_length, bool prepend_comma = false, const char separator = ',');
-  int32 get_age();
+  uint32 get_age();
   int64 get_content_length();
   time_t get_date();
   time_t get_expires();
@@ -933,7 +933,7 @@ public:
   void set_cooked_cc_need_revalidate_once();
   void unset_cooked_cc_need_revalidate_once();
 
-  void set_age(int32 value);
+  void set_age(uint32 value);
   void set_content_length(int64 value);
   void set_date(time_t value);
   void set_expires(time_t value);
@@ -1323,10 +1323,15 @@ MIMEHdr::value_append(const char *name, 
 /*-------------------------------------------------------------------------
   -------------------------------------------------------------------------*/
 
-inline int32
+inline uint32
 MIMEHdr::get_age()
 {
-  return (value_get_int(MIME_FIELD_AGE, MIME_LEN_AGE));
+  int64 age = value_get_int64(MIME_FIELD_AGE, MIME_LEN_AGE);
+
+  if (age < 0)
+    return 0;
+
+  return (age > INT_MAX ? (uint32)INT_MAX + 1 : age);
 }
 
 /*-------------------------------------------------------------------------
@@ -1489,9 +1494,9 @@ MIMEHdr::unset_cooked_cc_need_revalidate
   -------------------------------------------------------------------------*/
 
 inline void
-MIMEHdr::set_age(int32 value)
+MIMEHdr::set_age(uint32 value)
 {
-  value_set_int(MIME_FIELD_AGE, MIME_LEN_AGE, value);
+  value_set_uint(MIME_FIELD_AGE, MIME_LEN_AGE, value);
 }
 
 /*-------------------------------------------------------------------------

Modified: trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc?rev=1002261&r1=1002260&r2=1002261&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc (original)
+++ trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc Tue Sep 28 16:51:47 2010
@@ -4870,8 +4870,12 @@ HttpTransact::merge_and_update_headers_f
       date_value = s->request_sent_time;
     }
     date_value = max(s->current.now - date_value, (time_t) 0);
-    if (s->hdr_info.server_response.presence(MIME_PRESENCE_AGE))
-      date_value += s->hdr_info.server_response.get_age();
+    if (s->hdr_info.server_response.presence(MIME_PRESENCE_AGE)) {
+      int64 new_age = s->hdr_info.server_response.get_age() + date_value;
+      
+      // Check for overflow
+      date_value = new_age > INT_MAX ? (uint32)INT_MAX + 1 : new_age;
+    }
     cached_hdr->set_age(date_value);
 
     delete_warning_value(cached_hdr, HTTP_WARNING_CODE_REVALIDATION_FAILED);

Modified: trafficserver/traffic/trunk/proxy/http2/HttpTransactHeaders.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/http2/HttpTransactHeaders.cc?rev=1002261&r1=1002260&r2=1002261&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/http2/HttpTransactHeaders.cc (original)
+++ trafficserver/traffic/trunk/proxy/http2/HttpTransactHeaders.cc Tue Sep 28 16:51:47 2010
@@ -425,8 +425,7 @@ HttpTransactHeaders::calculate_document_
   ink_time_t now_value = 0;
 
   ink_time_t tmp_value = 0;
-  tmp_value = base_response->get_age();
-  age_value = (tmp_value > 0) ? tmp_value : 0;
+  age_value = base_response->get_age();
 
   tmp_value = base_response_date;
   date_value = (tmp_value > 0) ? tmp_value : 0;