@@ -1738,7 +1738,8 @@ tfw_hpack_cache_decode_expand(TfwHPack *__restrict hp,
1738
1738
TfwHttpTransIter * mit = & resp -> mit ;
1739
1739
TfwMsgIter * it = & mit -> iter ;
1740
1740
bool h2_mode = TFW_MSG_H2 (resp -> req );
1741
- const unsigned char * prev , * last = src + n ;
1741
+ const unsigned char * last = src + n ;
1742
+ unsigned char * prev = src ;
1742
1743
struct sk_buff * * skb_head = & resp -> msg .skb_head ;
1743
1744
1744
1745
#define GET_NEXT_DATA (cond ) \
@@ -1814,14 +1815,14 @@ do { \
1814
1815
if (hp -> index == 0x0F ) {
1815
1816
GET_FLEXIBLE_lambda (hp -> index ,
1816
1817
HPACK_STATE_INDEX , {
1817
- FIXUP_H2_DATA (& dc_iter -> h2_data , src ,
1818
+ FIXUP_H2_DATA (& dc_iter -> data . h2 , prev ,
1818
1819
src - prev );
1819
1820
});
1820
1821
}
1821
1822
1822
1823
T_DBG3 ("%s: name index: %lu\n" , __func__ , hp -> index );
1823
1824
1824
- FIXUP_H2_DATA (& dc_iter -> h2_data , src , src - prev );
1825
+ FIXUP_H2_DATA (& dc_iter -> data . h2 , prev , src - prev );
1825
1826
1826
1827
NEXT_STATE (hp -> index
1827
1828
? HPACK_STATE_INDEXED_NAME_TEXT
@@ -1846,7 +1847,7 @@ do { \
1846
1847
if (unlikely (hp -> length == 0x7F )) {
1847
1848
GET_FLEXIBLE_lambda (hp -> length ,
1848
1849
HPACK_STATE_NAME_LENGTH , {
1849
- FIXUP_H2_DATA (& dc_iter -> h2_data , src ,
1850
+ FIXUP_H2_DATA (& dc_iter -> data . h2 , prev ,
1850
1851
src - prev );
1851
1852
});
1852
1853
}
@@ -1857,7 +1858,7 @@ do { \
1857
1858
1858
1859
T_DBG3 ("%s: name length: %lu\n" , __func__ , hp -> length );
1859
1860
1860
- FIXUP_H2_DATA (& dc_iter -> h2_data , src , src - prev );
1861
+ FIXUP_H2_DATA (& dc_iter -> data . h2 , prev , src - prev );
1861
1862
1862
1863
NEXT_STATE (HPACK_STATE_NAME_TEXT );
1863
1864
@@ -1884,8 +1885,8 @@ do { \
1884
1885
goto out ;
1885
1886
}
1886
1887
1887
- dc_iter -> hdr_data .len = entry -> name_len ;
1888
- dc_iter -> hdr_data .data = __TFW_STR_CH (entry -> hdr , 0 )-> data ;
1888
+ dc_iter -> data . hdr .len = entry -> name_len ;
1889
+ dc_iter -> data . hdr .data = __TFW_STR_CH (entry -> hdr , 0 )-> data ;
1889
1890
1890
1891
goto check_name_text ;
1891
1892
@@ -1898,9 +1899,10 @@ do { \
1898
1899
get_name_text :
1899
1900
m_len = min ((unsigned long )(last - src ), hp -> length );
1900
1901
1901
- T_DBG3 ("%s: decoding header name, m_len=%lu\n" , __func__ , m_len );
1902
+ T_DBG3 ("%s: decoding header name, m_len=%lu\n" , __func__ ,
1903
+ m_len );
1902
1904
1903
- FIXUP_DATA (& dc_iter -> hdr_data , src , m_len );
1905
+ FIXUP_DATA (& dc_iter -> data . hdr , src , m_len );
1904
1906
1905
1907
hp -> length -= m_len ;
1906
1908
src += m_len ;
@@ -1909,46 +1911,36 @@ do { \
1909
1911
check_name_text :
1910
1912
i = 0 ;
1911
1913
h_mods = dc_iter -> h_mods ;
1912
- WARN_ON_ONCE (dc_iter -> desc );
1913
1914
if (h_mods ) {
1914
1915
for (; i < h_mods -> sz ; ++ i ) {
1915
1916
TfwHdrModsDesc * d = & h_mods -> hdrs [i ];
1916
1917
1917
- if (!__hdr_name_cmp (& dc_iter -> hdr_data , d -> hdr ))
1918
+ if (!d -> append
1919
+ && !__hdr_name_cmp (& dc_iter -> data .hdr ,
1920
+ d -> hdr ))
1918
1921
{
1919
- dc_iter -> desc = d ;
1920
- break ;
1922
+ /*
1923
+ * All duplicate headers must be
1924
+ * skipped by caller.
1925
+ */
1926
+ dc_iter -> skip = true;
1927
+ goto out ;
1921
1928
}
1922
1929
}
1923
1930
}
1924
1931
1925
- if (dc_iter -> desc ) {
1926
- /* All duplicate headers must be skipped by caller. */
1927
- WARN_ON_ONCE (test_bit (i , mit -> found ));
1928
- __set_bit (i , mit -> found );
1929
- /*
1930
- * Header modifications format: 0 chunk - header name,
1931
- * optional 1st chunk - header value. If the value is
1932
- * empty, then the header is about to be removed,
1933
- * don't write it.
1934
- */
1935
-
1936
- /* FIXME: this is a temporary WA for GCC12, see #1695 for details */
1937
- if (TFW_STR_CHUNK (dc_iter -> desc -> hdr , 1 ) == NULL ) {
1938
- dc_iter -> skip = true;
1939
- goto out ;
1940
- }
1941
-
1942
- }
1943
-
1944
- if (h2_mode )
1945
- EXPAND_STR_DATA (& dc_iter -> h2_data );
1946
-
1947
- EXPAND_STR_DATA (& dc_iter -> hdr_data );
1948
- TFW_STR_INIT (& dc_iter -> hdr_data );
1949
-
1950
- if (!h2_mode )
1932
+ if (h2_mode ) {
1933
+ /* Write HPACK related data. */
1934
+ EXPAND_STR_DATA (& dc_iter -> data .h2 );
1935
+ /* Write header name. */
1936
+ if (!hp -> index )
1937
+ EXPAND_STR_DATA (& dc_iter -> data .hdr );
1938
+ TFW_STR_INIT (& dc_iter -> data .h2 );
1939
+ } else {
1940
+ EXPAND_STR_DATA (& dc_iter -> data .hdr );
1951
1941
EXPAND_DATA (S_DLM , SLEN (S_DLM ));
1942
+ }
1943
+ TFW_STR_INIT (& dc_iter -> data .hdr );
1952
1944
1953
1945
T_DBG3 ("%s: name copied, n=%lu, tail=%lu, hp->length=%lu\n" ,
1954
1946
__func__ , n , last - src , hp -> length );
@@ -1971,14 +1963,13 @@ do { \
1971
1963
if (unlikely (hp -> length == 0x7F ))
1972
1964
GET_FLEXIBLE_lambda (hp -> length ,
1973
1965
HPACK_STATE_VALUE_LENGTH , {
1974
- if (! dc_iter -> desc )
1975
- EXPAND_H2_DATA ( src , src - prev );
1966
+ FIXUP_H2_DATA ( & dc_iter -> data . h2 , prev ,
1967
+ src - prev );
1976
1968
});
1977
1969
1978
1970
T_DBG3 ("%s: value length: %lu\n" , __func__ , hp -> length );
1979
1971
1980
- if (!dc_iter -> desc )
1981
- EXPAND_H2_DATA (src , src - prev );
1972
+ FIXUP_H2_DATA (& dc_iter -> data .h2 , prev , src - prev );
1982
1973
1983
1974
NEXT_STATE (HPACK_STATE_VALUE_TEXT );
1984
1975
@@ -2003,71 +1994,16 @@ do { \
2003
1994
T_DBG3 ("%s: decode header value...\n" , __func__ );
2004
1995
m_len = min ((unsigned long )(last - src ), hp -> length );
2005
1996
2006
- if (dc_iter -> desc && dc_iter -> desc -> append && h2_mode ) {
2007
- /*
2008
- * If the header value must be appended, we need to
2009
- * collect the value for HTTP/2-header, since it should
2010
- * be re-encoded in this case.
2011
- */
2012
- FIXUP_DATA (& dc_iter -> hdr_data , src , m_len );
2013
- }
2014
- else if (!dc_iter -> desc || dc_iter -> desc -> append ) {
2015
- EXPAND_DATA (src , m_len );
2016
- }
1997
+ if (h2_mode )
1998
+ EXPAND_STR_DATA (& dc_iter -> data .h2 );
1999
+
2000
+ EXPAND_DATA (src , m_len );
2017
2001
2018
2002
hp -> length -= m_len ;
2019
2003
src += m_len ;
2020
2004
2021
2005
GET_NEXT_DATA (hp -> length );
2022
2006
2023
- if (dc_iter -> desc ) {
2024
- TfwStr * val , * h = dc_iter -> desc -> hdr ;
2025
- /*
2026
- * Header value is stored in chunk 1, see
2027
- * tfw_cfgop_mod_hdr_add().
2028
- */
2029
- TfwStr n_val = {
2030
- .chunks = (TfwStr []){
2031
- { .data = ", " , .len = 2 },
2032
- { .data = __TFW_STR_CH (h , 1 )-> data ,
2033
- .len = __TFW_STR_CH (h , 1 )-> len }
2034
- },
2035
- .len = __TFW_STR_CH (h , 1 )-> len + 2 ,
2036
- .nchunks = 2
2037
- };
2038
-
2039
- dc_iter -> skip = true;
2040
-
2041
- if (h2_mode ) {
2042
- TfwHPackInt vlen ;
2043
-
2044
- if (dc_iter -> desc -> append ) {
2045
- val = & dc_iter -> hdr_data ;
2046
- if (tfw_strcat (resp -> pool , val , & n_val ))
2047
- {
2048
- r = T_DROP ;
2049
- goto out ;
2050
- }
2051
- }
2052
- else {
2053
- val = __TFW_STR_CH (& n_val , 1 );
2054
- }
2055
-
2056
- write_int (val -> len , 0x7F , 0 , & vlen );
2057
-
2058
- EXPAND_DATA (vlen .buf , vlen .sz );
2059
- EXPAND_STR_DATA (val );
2060
-
2061
- break ;
2062
- }
2063
-
2064
- val = dc_iter -> desc -> append
2065
- ? & n_val
2066
- : __TFW_STR_CH (& n_val , 1 );
2067
-
2068
- EXPAND_STR_DATA (val );
2069
- }
2070
-
2071
2007
if (!h2_mode )
2072
2008
EXPAND_DATA (S_CRLF , SLEN (S_CRLF ));
2073
2009
@@ -2076,7 +2012,7 @@ do { \
2076
2012
case HPACK_STATE_INDEX :
2077
2013
prev = src ;
2078
2014
GET_CONTINUE_lambda (hp -> index , {
2079
- FIXUP_H2_DATA (& dc_iter -> h2_data , src , src - prev );
2015
+ FIXUP_H2_DATA (& dc_iter -> data . h2 , prev , src - prev );
2080
2016
});
2081
2017
T_DBG3 ("%s: index finally decoded: %lu\n" , __func__ , hp -> index );
2082
2018
@@ -2089,7 +2025,7 @@ do { \
2089
2025
case HPACK_STATE_NAME_LENGTH :
2090
2026
prev = src ;
2091
2027
GET_CONTINUE_lambda (hp -> length , {
2092
- FIXUP_H2_DATA (& dc_iter -> h2_data , src , src - prev );
2028
+ FIXUP_H2_DATA (& dc_iter -> data . h2 , prev , src - prev );
2093
2029
});
2094
2030
T_DBG3 ("%s: name length finally decoded: %lu\n" , __func__ ,
2095
2031
hp -> length );
@@ -2103,8 +2039,7 @@ do { \
2103
2039
case HPACK_STATE_VALUE_LENGTH :
2104
2040
prev = src ;
2105
2041
GET_CONTINUE_lambda (hp -> length , {
2106
- if (!dc_iter -> desc )
2107
- EXPAND_H2_DATA (src , src - prev );
2042
+ EXPAND_H2_DATA (prev , src - prev );
2108
2043
});
2109
2044
T_DBG3 ("%s: value length finally decoded: %lu\n" , __func__ ,
2110
2045
hp -> length );
0 commit comments