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

[1/2] git commit: TS-2672: allow mime_hdr_field_detach to be called on detached MIME headers

Repository: trafficserver
Updated Branches:
  refs/heads/master 9c84680a0 -> 5d38019f2


TS-2672: allow mime_hdr_field_detach to be called on detached MIME headers

Allow mime_hdr_field_detach() to be called on detached MIME headers
so that TSMimeHdrFieldDestroy() can be called on a field that has
been detached by TSMimeHdrFieldRemove(). This matches the behavior
of mime_hdr_field_attach(), which silently ignores calls to attach
fields that are not detached.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/b92bbc1e
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/b92bbc1e
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/b92bbc1e

Branch: refs/heads/master
Commit: b92bbc1ed0cf2b0aef00531e2b9e03a9ef46f2e2
Parents: 9c84680
Author: James Peach <jp...@apache.org>
Authored: Wed Mar 26 16:54:59 2014 -0700
Committer: James Peach <jp...@apache.org>
Committed: Thu Mar 27 10:14:46 2014 -0700

----------------------------------------------------------------------
 CHANGES            | 2 ++
 proxy/hdrs/MIME.cc | 8 +++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b92bbc1e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index a60ef74..5e6e208 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 5.0.0
 
+  *) [TS-2672] TSMimeHdrFieldDestroy should not assert on removed fields.
+
   *) [TS-2554] New plugin: background_fetch, which under certain conditions
    will kick off a background fetch when it detects Range request and
    responses. This allows for the cache to start populating objects that would

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b92bbc1e/proxy/hdrs/MIME.cc
----------------------------------------------------------------------
diff --git a/proxy/hdrs/MIME.cc b/proxy/hdrs/MIME.cc
index 0de0db2..a2b61c8 100644
--- a/proxy/hdrs/MIME.cc
+++ b/proxy/hdrs/MIME.cc
@@ -1517,8 +1517,14 @@ mime_hdr_field_detach(MIMEHdrImpl *mh, MIMEField *field, bool detach_all_dups)
 {
   MIMEField *next_dup = field->m_next_dup;
 
-  ink_assert(field->is_live());
+  // If this field is already detached, there's nothing to do. There must
+  // not be a dup list if we detached correctly.
+  if (field->m_readiness == MIME_FIELD_SLOT_READINESS_DETACHED) {
+    ink_assert(next_dup == NULL);
+    return;
+  }
 
+  ink_assert(field->is_live());
   MIME_HDR_SANITY_CHECK(mh);
 
   // Normally, this function is called with the current dup list head,


[2/2] git commit: TS-2672: add MIMEField::is_detached to match is_live

Posted by jp...@apache.org.
TS-2672: add MIMEField::is_detached to match is_live

Add a matching is_detached accessor for the MIMEField readiness
state. Update all the non-assertion places that access
MIMEField::m_readiness directly.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/5d38019f
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/5d38019f
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/5d38019f

Branch: refs/heads/master
Commit: 5d38019f2dab63e0f49f6b655e3f535d8e960528
Parents: b92bbc1
Author: James Peach <jp...@apache.org>
Authored: Wed Mar 26 16:26:35 2014 -0700
Committer: James Peach <jp...@apache.org>
Committed: Thu Mar 27 10:14:47 2014 -0700

----------------------------------------------------------------------
 proxy/hdrs/MIME.cc | 37 +++++++++++++++++++++++--------------
 proxy/hdrs/MIME.h  | 25 ++++++++++++++-----------
 2 files changed, 37 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/5d38019f/proxy/hdrs/MIME.cc
----------------------------------------------------------------------
diff --git a/proxy/hdrs/MIME.cc b/proxy/hdrs/MIME.cc
index a2b61c8..084ecef 100644
--- a/proxy/hdrs/MIME.cc
+++ b/proxy/hdrs/MIME.cc
@@ -522,7 +522,7 @@ mime_hdr_sanity_check(MIMEHdrImpl *mh)
     for (index = 0; index < fblock->m_freetop; index++) {
       field = &(fblock->m_field_slots[index]);
 
-      if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE) {
+      if (field->is_live()) {
         // dummy operations just to make sure deref doesn't crash
         checksum_block(field->m_ptr_name, field->m_len_name);
         if (field->m_ptr_value)
@@ -1143,10 +1143,13 @@ void
 mime_hdr_field_block_list_adjust(int /* block_count ATS_UNUSED */, MIMEFieldBlockImpl *old_list,
                                  MIMEFieldBlockImpl *new_list)
 {
-  for (MIMEFieldBlockImpl *new_blk = new_list; new_blk; new_blk = new_blk->m_next)
-    for (MIMEField *field = new_blk->m_field_slots, *end=field + new_blk->m_freetop; field != end; ++field)
-      if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE && field->m_next_dup)
+  for (MIMEFieldBlockImpl *new_blk = new_list; new_blk; new_blk = new_blk->m_next) {
+    for (MIMEField *field = new_blk->m_field_slots, *end=field + new_blk->m_freetop; field != end; ++field) {
+      if (field->is_live() && field->m_next_dup) {
         relocate(field, new_list, old_list);
+      }
+    }
+  }
 }
 
 int
@@ -1161,8 +1164,9 @@ mime_hdr_length_get(MIMEHdrImpl *mh)
   for (fblock = &(mh->m_first_fblock); fblock != NULL; fblock = fblock->m_next) {
     for (index = 0; index < fblock->m_freetop; index++) {
       field = &(fblock->m_field_slots[index]);
-      if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE)
+      if (field->is_live()) {
         length += mime_field_length_get(field);
+      }
     }
   }
 
@@ -1418,8 +1422,9 @@ mime_hdr_field_attach(MIMEHdrImpl *mh, MIMEField *field, int check_for_dups, MIM
 {
   MIME_HDR_SANITY_CHECK(mh);
 
-  if (field->m_readiness != MIME_FIELD_SLOT_READINESS_DETACHED)
+  if (!field->is_detached()) {
     return;
+  }
 
   ink_assert(field->m_ptr_name != NULL);
 
@@ -1519,7 +1524,7 @@ mime_hdr_field_detach(MIMEHdrImpl *mh, MIMEField *field, bool detach_all_dups)
 
   // If this field is already detached, there's nothing to do. There must
   // not be a dup list if we detached correctly.
-  if (field->m_readiness == MIME_FIELD_SLOT_READINESS_DETACHED) {
+  if (field->is_detached()) {
     ink_assert(next_dup == NULL);
     return;
   }
@@ -1590,15 +1595,21 @@ mime_hdr_field_delete(HdrHeap *heap, MIMEHdrImpl *mh, MIMEField *field, bool del
 
       MIME_HDR_SANITY_CHECK(mh);
       mime_hdr_field_detach(mh, field, 0);
+
       MIME_HDR_SANITY_CHECK(mh);
       mime_field_destroy(mh, field);
+
       MIME_HDR_SANITY_CHECK(mh);
       field = next;
     }
   } else {
     heap->free_string(field->m_ptr_name, field->m_len_name);
     heap->free_string(field->m_ptr_value, field->m_len_value);
+
+    MIME_HDR_SANITY_CHECK(mh);
     mime_hdr_field_detach(mh, field, 0);
+
+    MIME_HDR_SANITY_CHECK(mh);
     mime_field_destroy(mh, field);
   }
 
@@ -3521,7 +3532,7 @@ MIMEFieldBlockImpl::marshal(MarshalXlate *ptr_xlate, int num_ptr, MarshalXlate *
     for (uint32_t index = 0; index < m_freetop; index++) {
       MIMEField *field = &(m_field_slots[index]);
 
-      if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE) {
+      if (field->is_live()) {
         HDR_MARSHAL_STR_1(field->m_ptr_name, str_xlate);
         HDR_MARSHAL_STR_1(field->m_ptr_value, str_xlate);
         if (field->m_next_dup) {
@@ -3533,7 +3544,7 @@ MIMEFieldBlockImpl::marshal(MarshalXlate *ptr_xlate, int num_ptr, MarshalXlate *
     for (uint32_t index = 0; index < m_freetop; index++) {
       MIMEField *field = &(m_field_slots[index]);
 
-      if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE) {
+      if (field->is_live()) {
         HDR_MARSHAL_STR(field->m_ptr_name, str_xlate, num_str);
         HDR_MARSHAL_STR(field->m_ptr_value, str_xlate, num_str);
         if (field->m_next_dup) {
@@ -3555,7 +3566,7 @@ MIMEFieldBlockImpl::unmarshal(intptr_t offset)
     MIMEField *field = &(m_field_slots[index]);
 
     // FIX ME - DO I NEED TO DEAL WITH OTHER READINESSES?
-    if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE) {
+    if (field->is_live()) {
       HDR_UNMARSHAL_STR(field->m_ptr_name, offset);
       HDR_UNMARSHAL_STR(field->m_ptr_value, offset);
       if (field->m_next_dup) {
@@ -3572,8 +3583,7 @@ MIMEFieldBlockImpl::move_strings(HdrStrHeap *new_heap)
   for (uint32_t index = 0; index < m_freetop; index++) {
     MIMEField *field = &(m_field_slots[index]);
 
-    if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE ||
-        field->m_readiness == MIME_FIELD_SLOT_READINESS_DETACHED) {
+    if (field->is_live() || field->is_detached()) {
       // FIX ME - Should do the field in one shot and preserve
       //   raw_printable if it's set
       field->m_n_v_raw_printable = 0;
@@ -3590,8 +3600,7 @@ MIMEFieldBlockImpl::check_strings(HeapCheck *heaps, int num_heaps)
   for (uint32_t index = 0; index < m_freetop; index++) {
     MIMEField *field = &(m_field_slots[index]);
 
-    if (field->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE ||
-        field->m_readiness == MIME_FIELD_SLOT_READINESS_DETACHED) {
+    if (field->is_live() || field->is_detached()) {
       // FIX ME - Should check raw printing characters as well
       CHECK_STR(field->m_ptr_name, field->m_len_name, heaps, num_heaps);
       CHECK_STR(field->m_ptr_value, field->m_len_value, heaps, num_heaps);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/5d38019f/proxy/hdrs/MIME.h
----------------------------------------------------------------------
diff --git a/proxy/hdrs/MIME.h b/proxy/hdrs/MIME.h
index 9c7b721..04bc35b 100644
--- a/proxy/hdrs/MIME.h
+++ b/proxy/hdrs/MIME.h
@@ -110,24 +110,27 @@ struct MIMEField
   uint8_t m_readiness:2;          // 2/8
   uint8_t m_flags:2;              // 2/8
 
-  int is_dup_head()
-  {
+  bool is_dup_head() const {
     return (m_flags & MIME_FIELD_SLOT_FLAGS_DUP_HEAD);
   }
-  int is_live()
-  {
+
+  bool is_cooked() {
+    return (m_flags & MIME_FIELD_SLOT_FLAGS_COOKED);
+  }
+
+  bool is_live() const {
     return (m_readiness == MIME_FIELD_SLOT_READINESS_LIVE);
   }
-  int is_cooked()
-  {
-    return (m_flags & MIME_FIELD_SLOT_FLAGS_COOKED);
+
+  bool is_detached() const {
+    return (m_readiness == MIME_FIELD_SLOT_READINESS_DETACHED);
   }
-  int supports_commas()
-  {
+
+  bool supports_commas() const {
     if (m_wks_idx >= 0)
       return (hdrtoken_index_to_flags(m_wks_idx) & MIME_FLAGS_COMMAS);
     else
-      return (1);               // by default, assume supports commas
+      return true;               // by default, assume supports commas
   }
 
   const char *name_get(int *length);
@@ -1134,7 +1137,7 @@ MIMEHdr::iter_get_next(MIMEFieldIter * iter)
   while (b) {
     for (; slot < (int) b->m_freetop; slot++) {
       f = &(b->m_field_slots[slot]);
-      if (f->m_readiness == MIME_FIELD_SLOT_READINESS_LIVE) {
+      if (f->is_live()) {
         iter->m_slot = slot;
         iter->m_block = b;
         return f;