@@ -3021,19 +3021,17 @@ tfw_hpack_rbuf_commit(TfwHPackETbl *__restrict tbl,
3021
3021
* headers will be evicted from the index table.
3022
3022
*/
3023
3023
static int
3024
- tfw_hpack_add_node (TfwHPackETbl * __restrict tbl , TfwStr * __restrict hdr ,
3025
- TfwHPackNodeIter * __restrict place , bool spcolon )
3024
+ tfw_hpack_add_node (TfwHPackETbl * __restrict tbl , TfwStr * __restrict h_name ,
3025
+ TfwStr * __restrict h_val , TfwHPackNodeIter * __restrict place )
3026
3026
{
3027
3027
char * ptr ;
3028
3028
unsigned long node_size , hdr_len ;
3029
3029
unsigned short new_size , node_len ;
3030
3030
unsigned short cur_size = tbl -> size , window = tbl -> window ;
3031
3031
TfwHPackNode * del_list [HPACK_MAX_ENC_EVICTION ] = {};
3032
- TfwStr s_nm = {}, s_val = {};
3033
3032
TfwHPackETblIter it = {};
3034
3033
3035
- hdr_len = tfw_http_hdr_split (hdr , & s_nm , & s_val , spcolon );
3036
- WARN_ON_ONCE (TFW_STR_EMPTY (& s_nm ));
3034
+ hdr_len = h_name -> len + h_val -> len ;
3037
3035
3038
3036
WARN_ON_ONCE (cur_size > window || window > HPACK_ENC_TABLE_MAX_SIZE );
3039
3037
if ((node_size = hdr_len + HPACK_ENTRY_OVERHEAD ) > window ) {
@@ -3126,14 +3124,14 @@ tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
3126
3124
it .size += node_size ;
3127
3125
it .rb_len += node_len ;
3128
3126
it .last -> hdr_len = hdr_len ;
3129
- it .last -> name_len = s_nm . len ;
3127
+ it .last -> name_len = h_name -> len ;
3130
3128
it .last -> rindex = ++ tbl -> idx_acc ;
3131
3129
3132
- tfw_hpack_rbuf_commit (tbl , & s_nm , & s_val , del_list , place , & it );
3130
+ tfw_hpack_rbuf_commit (tbl , h_name , h_val , del_list , place , & it );
3133
3131
3134
- ptr = tfw_hpack_write (& s_nm , it .last -> hdr );
3135
- if (!TFW_STR_EMPTY (& s_val ))
3136
- tfw_hpack_write (& s_val , ptr );
3132
+ ptr = tfw_hpack_write (h_name , it .last -> hdr );
3133
+ if (!TFW_STR_EMPTY (h_val ))
3134
+ tfw_hpack_write (h_val , ptr );
3137
3135
3138
3136
WARN_ON_ONCE (tbl -> rb_len > tbl -> size );
3139
3137
@@ -3145,36 +3143,28 @@ tfw_hpack_add_node(TfwHPackETbl *__restrict tbl, TfwStr *__restrict hdr,
3145
3143
* encoder dynamic table with potentially concurrent access from different
3146
3144
* threads, so lock is used to protect the find/add/erase operations inside
3147
3145
* this procedure.
3148
- *
3149
- * TODO #1411: get rid of tfw_http_hdr_split and related safety checks
3150
3146
*/
3151
3147
static TfwHPackETblRes
3152
3148
tfw_hpack_encoder_index (TfwHPackETbl * __restrict tbl ,
3153
- TfwStr * __restrict hdr ,
3149
+ TfwStr * __restrict h_name ,
3150
+ TfwStr * __restrict h_val ,
3154
3151
unsigned short * __restrict out_index ,
3155
- unsigned long * __restrict flags ,
3156
- bool spcolon )
3152
+ unsigned long * __restrict flags )
3157
3153
{
3158
3154
TfwHPackNodeIter place = {};
3159
3155
const TfwHPackNode * node = NULL ;
3160
3156
TfwHPackETblRes res = HPACK_IDX_ST_NOT_FOUND ;
3161
- TfwStr h_name = {}, h_val = {};
3162
3157
3163
3158
BUILD_BUG_ON (HPACK_IDX_ST_MASK < _HPACK_IDX_ST_NUM - 1 );
3164
- if (WARN_ON_ONCE (!hdr ))
3165
- return - EINVAL ;
3166
3159
3167
- tfw_http_hdr_split (hdr , & h_name , & h_val , spcolon );
3168
- if (WARN_ON_ONCE (TFW_STR_EMPTY (& h_name )))
3169
- return - EINVAL ;
3170
- res = tfw_hpack_rbtree_find (tbl , & h_name , & h_val , & node , & place );
3160
+ res = tfw_hpack_rbtree_find (tbl , h_name , h_val , & node , & place );
3171
3161
3172
3162
WARN_ON_ONCE (!node && res != HPACK_IDX_ST_NOT_FOUND );
3173
3163
3174
3164
* out_index = HPACK_NODE_GET_INDEX (tbl , node );
3175
3165
3176
3166
if (res != HPACK_IDX_ST_FOUND
3177
- && !tfw_hpack_add_node (tbl , hdr , & place , spcolon ))
3167
+ && !tfw_hpack_add_node (tbl , h_name , h_val , & place ))
3178
3168
res |= HPACK_IDX_FLAG_ADD ;
3179
3169
3180
3170
return res ;
@@ -3419,31 +3409,23 @@ tfw_hpack_write_idx(TfwHttpResp *__restrict resp, TfwHPackInt *__restrict idx,
3419
3409
* response @resp using @resp->pool.
3420
3410
*/
3421
3411
static int
3422
- tfw_hpack_hdr_add (TfwHttpResp * __restrict resp , TfwStr * __restrict hdr ,
3423
- TfwHPackInt * __restrict idx , bool name_indexed , bool trans )
3412
+ tfw_hpack_hdr_add (TfwHttpResp * __restrict resp , TfwStr * __restrict h_name ,
3413
+ TfwStr * __restrict h_val , TfwHPackInt * __restrict idx ,
3414
+ bool name_indexed , bool trans )
3424
3415
{
3425
3416
int r ;
3426
3417
TfwHPackInt vlen ;
3427
- TfwStr s_name = {}, s_val = {}, s_vlen = {};
3428
-
3429
- if (!hdr )
3430
- return - EINVAL ;
3418
+ TfwStr s_vlen = {};
3431
3419
3432
3420
r = tfw_hpack_write_idx (resp , idx , true);
3433
3421
if (unlikely (r ))
3434
3422
return r ;
3435
3423
3436
- if (WARN_ON_ONCE (TFW_STR_PLAIN (hdr ) || TFW_STR_DUP (hdr )))
3437
- return - EINVAL ;
3438
-
3439
- if (!tfw_http_hdr_split (hdr , & s_name , & s_val , trans ))
3440
- return - EINVAL ;
3441
-
3442
3424
if (unlikely (!name_indexed )) {
3443
3425
TfwHPackInt nlen ;
3444
3426
TfwStr s_nlen = {};
3445
3427
3446
- write_int (s_name . len , 0x7F , 0 , & nlen );
3428
+ write_int (h_name -> len , 0x7F , 0 , & nlen );
3447
3429
s_nlen .data = nlen .buf ;
3448
3430
s_nlen .len = nlen .sz ;
3449
3431
@@ -3452,23 +3434,23 @@ tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3452
3434
return r ;
3453
3435
3454
3436
if (trans )
3455
- r = tfw_http_msg_expand_from_pool_lc (resp , & s_name );
3437
+ r = tfw_http_msg_expand_from_pool_lc (resp , h_name );
3456
3438
else
3457
- r = tfw_http_msg_expand_from_pool (resp , & s_name );
3439
+ r = tfw_http_msg_expand_from_pool (resp , h_name );
3458
3440
if (unlikely (r ))
3459
3441
return r ;
3460
3442
}
3461
3443
3462
- write_int (s_val . len , 0x7F , 0 , & vlen );
3444
+ write_int (h_val -> len , 0x7F , 0 , & vlen );
3463
3445
s_vlen .data = vlen .buf ;
3464
3446
s_vlen .len = vlen .sz ;
3465
3447
3466
3448
r = tfw_http_msg_expand_from_pool (resp , & s_vlen );
3467
-
3468
3449
if (unlikely (r ))
3469
3450
return r ;
3470
- if (!TFW_STR_EMPTY (& s_val ))
3471
- r = tfw_http_msg_expand_from_pool (resp , & s_val );
3451
+
3452
+ if (!TFW_STR_EMPTY (h_val ))
3453
+ r = tfw_http_msg_expand_from_pool (resp , h_val );
3472
3454
3473
3455
return r ;
3474
3456
}
@@ -3560,6 +3542,15 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3560
3542
TfwHPackETbl * tbl = & ctx -> hpack .enc_tbl ;
3561
3543
int r = HPACK_IDX_ST_NOT_FOUND ;
3562
3544
bool name_indexed = true;
3545
+ TfwStr h_name = {}, h_val = {};
3546
+
3547
+ #define __HDR_SPLIT (hdr ) \
3548
+ do { \
3549
+ if (unlikely(TFW_STR_PLAIN(hdr) || TFW_STR_DUP(hdr) \
3550
+ || !tfw_http_hdr_split(hdr, &h_name, &h_val, trans) \
3551
+ || TFW_STR_EMPTY(&h_name))) \
3552
+ return -EINVAL; \
3553
+ } while(0)
3563
3554
3564
3555
if (WARN_ON_ONCE (!hdr || TFW_STR_EMPTY (hdr )))
3565
3556
return - EINVAL ;
@@ -3572,13 +3563,16 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3572
3563
T_DBG_PRINT_HPACK_RBTREE (tbl );
3573
3564
3574
3565
if (!st_full_index && dyn_indexing ) {
3566
+ __HDR_SPLIT (hdr );
3575
3567
assert_spin_locked (& conn -> sk -> sk_lock .slock );
3576
- r = tfw_hpack_encoder_index (tbl , hdr , & index , resp -> flags ,
3577
- trans );
3568
+ r = tfw_hpack_encoder_index (tbl , & h_name , & h_val ,
3569
+ & index , resp -> flags );
3578
3570
if (r < 0 )
3579
3571
return r ;
3580
3572
}
3581
3573
3574
+ if (TFW_STR_PLAIN (hdr ))
3575
+
3582
3576
if (st_full_index || HPACK_IDX_RES (r ) == HPACK_IDX_ST_FOUND ) {
3583
3577
/*
3584
3578
* The full index (whether static or dynamic) always takes
@@ -3626,11 +3620,18 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3626
3620
name_indexed = false;
3627
3621
3628
3622
encode :
3629
- if (use_pool )
3630
- r = tfw_hpack_hdr_add (resp , hdr , & idx , name_indexed , trans );
3631
- else
3623
+ if (use_pool ) {
3624
+ if (!dyn_indexing )
3625
+ __HDR_SPLIT (hdr );
3626
+ r = tfw_hpack_hdr_add (resp , & h_name , & h_val , & idx ,
3627
+ name_indexed , trans );
3628
+ } else {
3632
3629
r = tfw_hpack_hdr_expand (resp , hdr , & idx , name_indexed );
3630
+ }
3631
+
3633
3632
return r ;
3633
+
3634
+ #undef __HDR_SPLIT
3634
3635
}
3635
3636
3636
3637
int
0 commit comments