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