@@ -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
}
@@ -3539,6 +3521,18 @@ tfw_hpack_hdr_expand(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3539
3521
return tfw_hpack_str_expand (mit , iter , skb_head , & s_val , NULL );
3540
3522
}
3541
3523
3524
+ static inline int
3525
+ __tfw_hpack_check_and_split_hdr (TfwStr * __restrict hdr , TfwStr * h_name ,
3526
+ TfwStr * h_val , bool trans )
3527
+ {
3528
+ if (unlikely (TFW_STR_PLAIN (hdr ) || TFW_STR_DUP (hdr )
3529
+ || !tfw_http_hdr_split (hdr , h_name , h_val , trans )
3530
+ || TFW_STR_EMPTY (h_name )))
3531
+ return - EINVAL ;
3532
+
3533
+ return 0 ;
3534
+ }
3535
+
3542
3536
/**
3543
3537
* Perform encoding of the header @hdr into the HTTP/2 HPACK format.
3544
3538
*
@@ -3565,6 +3559,7 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3565
3559
TfwHPackETbl * tbl = & ctx -> hpack .enc_tbl ;
3566
3560
int r = HPACK_IDX_ST_NOT_FOUND ;
3567
3561
bool name_indexed = true;
3562
+ TfwStr h_name = {}, h_val = {};
3568
3563
3569
3564
if (WARN_ON_ONCE (!hdr || TFW_STR_EMPTY (hdr )))
3570
3565
return - EINVAL ;
@@ -3577,11 +3572,14 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3577
3572
T_DBG_PRINT_HPACK_RBTREE (tbl );
3578
3573
3579
3574
if (!st_full_index && dyn_indexing ) {
3580
- assert_spin_locked (& conn -> sk -> sk_lock .slock );
3581
- r = tfw_hpack_encoder_index (tbl , hdr , & index , resp -> flags ,
3582
- trans );
3583
- if (r < 0 )
3575
+ r = __tfw_hpack_check_and_split_hdr (hdr , & h_name , & h_val ,
3576
+ trans );
3577
+ if (unlikely (r ))
3584
3578
return r ;
3579
+
3580
+ assert_spin_locked (& conn -> sk -> sk_lock .slock );
3581
+ r = tfw_hpack_encoder_index (tbl , & h_name , & h_val ,
3582
+ & index , resp -> flags );
3585
3583
}
3586
3584
3587
3585
if (st_full_index || HPACK_IDX_RES (r ) == HPACK_IDX_ST_FOUND ) {
@@ -3631,10 +3629,19 @@ __tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3631
3629
name_indexed = false;
3632
3630
3633
3631
encode :
3634
- if (use_pool )
3635
- r = tfw_hpack_hdr_add (resp , hdr , & idx , name_indexed , trans );
3636
- else
3632
+ if (use_pool ) {
3633
+ if (!dyn_indexing ) {
3634
+ r = __tfw_hpack_check_and_split_hdr (hdr , & h_name ,
3635
+ & h_val , trans );
3636
+ if (unlikely (r < 0 ))
3637
+ return r ;
3638
+ }
3639
+ r = tfw_hpack_hdr_add (resp , & h_name , & h_val , & idx ,
3640
+ name_indexed , trans );
3641
+ } else {
3637
3642
r = tfw_hpack_hdr_expand (resp , hdr , & idx , name_indexed );
3643
+ }
3644
+
3638
3645
return r ;
3639
3646
}
3640
3647
0 commit comments