@@ -333,6 +333,12 @@ HpackIndexingTable::update_maximum_size(uint32_t new_size)
333333 return _dynamic_table->update_maximum_size (new_size);
334334}
335335
336+ Arena &
337+ HpackIndexingTable::arena ()
338+ {
339+ return this ->_arena ;
340+ }
341+
336342//
337343// HpackDynamicTable
338344//
@@ -538,9 +544,10 @@ encode_literal_header_field_with_indexed_name(uint8_t *buf_start, const uint8_t
538544 p += len;
539545
540546 // Value String
547+ Arena &arena = indexing_table.arena ();
541548 int value_len;
542549 const char *value = header.value_get (&value_len);
543- len = xpack_encode_string (p, buf_end, value, value_len);
550+ len = xpack_encode_string (arena, p, buf_end, value, value_len);
544551 if (len == -1 ) {
545552 return -1 ;
546553 }
@@ -581,16 +588,17 @@ encode_literal_header_field_with_new_name(uint8_t *buf_start, const uint8_t *buf
581588
582589 // Convert field name to lower case to follow HTTP2 spec.
583590 // This conversion is needed because WKSs in MIMEFields is old fashioned
584- Arena arena;
591+ Arena & arena = indexing_table. arena () ;
585592 int name_len;
586593 const char *name = header.name_get (&name_len);
587- char *lower_name = arena.str_store (name, name_len);
594+ char *lower_name = arena.str_alloc ( name_len);
588595 for (int i = 0 ; i < name_len; i++) {
589- lower_name[i] = ParseRules::ink_tolower (lower_name [i]);
596+ lower_name[i] = ParseRules::ink_tolower (name [i]);
590597 }
591598
592599 // Name String
593- len = xpack_encode_string (p, buf_end, lower_name, name_len);
600+ len = xpack_encode_string (arena, p, buf_end, lower_name, name_len);
601+ arena.str_free (lower_name);
594602 if (len == -1 ) {
595603 return -1 ;
596604 }
@@ -599,7 +607,7 @@ encode_literal_header_field_with_new_name(uint8_t *buf_start, const uint8_t *buf
599607 // Value String
600608 int value_len;
601609 const char *value = header.value_get (&value_len);
602- len = xpack_encode_string (p, buf_end, value, value_len);
610+ len = xpack_encode_string (arena, p, buf_end, value, value_len);
603611 if (len == -1 ) {
604612 return -1 ;
605613 }
@@ -647,9 +655,7 @@ decode_indexed_header_field(MIMEFieldWrapper &header, const uint8_t *buf_start,
647655 int decoded_value_len;
648656 const char *decoded_value = header.value_get (&decoded_value_len);
649657
650- Arena arena;
651- Debug (" hpack_decode" , " Decoded field: %s: %s" , arena.str_store (decoded_name, decoded_name_len),
652- arena.str_store (decoded_value, decoded_value_len));
658+ Debug (" hpack_decode" , " Decoded field: %.*s: %.*s" , decoded_name_len, decoded_name, decoded_value_len, decoded_value);
653659 }
654660
655661 return len;
@@ -669,6 +675,7 @@ decode_literal_header_field(MIMEFieldWrapper &header, const uint8_t *buf_start,
669675 int64_t len = 0 ;
670676 HpackField ftype = hpack_parse_field_type (*p);
671677 bool has_http2_violation = false ;
678+ Arena &arena = indexing_table.arena ();
672679
673680 if (ftype == HpackField::INDEXED_LITERAL) {
674681 len = xpack_decode_integer (index, p, buf_end, 6 );
@@ -686,8 +693,6 @@ decode_literal_header_field(MIMEFieldWrapper &header, const uint8_t *buf_start,
686693
687694 p += len;
688695
689- Arena arena;
690-
691696 // Decode header field name
692697 if (index) {
693698 indexing_table.get_header_field (index, header);
@@ -697,6 +702,9 @@ decode_literal_header_field(MIMEFieldWrapper &header, const uint8_t *buf_start,
697702
698703 len = xpack_decode_string (arena, &name_str, name_str_len, p, buf_end);
699704 if (len == XPACK_ERROR_COMPRESSION_ERROR) {
705+ if (name_str) {
706+ arena.str_free (name_str);
707+ }
700708 return HPACK_ERROR_COMPRESSION_ERROR;
701709 }
702710
@@ -711,6 +719,7 @@ decode_literal_header_field(MIMEFieldWrapper &header, const uint8_t *buf_start,
711719
712720 p += len;
713721 header.name_set (name_str, name_str_len);
722+ arena.str_free (name_str);
714723 }
715724
716725 // Decode header field value
@@ -719,11 +728,15 @@ decode_literal_header_field(MIMEFieldWrapper &header, const uint8_t *buf_start,
719728
720729 len = xpack_decode_string (arena, &value_str, value_str_len, p, buf_end);
721730 if (len == XPACK_ERROR_COMPRESSION_ERROR) {
731+ if (value_str) {
732+ arena.str_free (value_str);
733+ }
722734 return HPACK_ERROR_COMPRESSION_ERROR;
723735 }
724736
725737 p += len;
726738 header.value_set (value_str, value_str_len);
739+ arena.str_free (value_str);
727740
728741 // Incremental Indexing adds header to header table as new entry
729742 if (isIncremental) {
@@ -737,8 +750,7 @@ decode_literal_header_field(MIMEFieldWrapper &header, const uint8_t *buf_start,
737750 int decoded_value_len;
738751 const char *decoded_value = header.value_get (&decoded_value_len);
739752
740- Debug (" hpack_decode" , " Decoded field: %s: %s" , arena.str_store (decoded_name, decoded_name_len),
741- arena.str_store (decoded_value, decoded_value_len));
753+ Debug (" hpack_decode" , " Decoded field: %.*s: %.*s" , decoded_name_len, decoded_name, decoded_value_len, decoded_value);
742754 }
743755
744756 if (has_http2_violation) {
0 commit comments