@@ -289,12 +289,14 @@ do { \
289
289
do { \
290
290
WARN_ON_ONCE(!TFW_STR_EMPTY(&it->hdr)); \
291
291
if (state & HPACK_FLAGS_HUFFMAN_NAME) { \
292
- BUFFER_GET(length, it); \
292
+ unsigned long len = length + (length >> 1); \
293
+ \
294
+ BUFFER_GET(len, it); \
293
295
if (!it->pos) { \
294
296
r = -ENOMEM; \
295
297
goto out; \
296
298
} \
297
- BUFFER_HDR_INIT(length , it); \
299
+ BUFFER_HDR_INIT(len , it); \
298
300
} \
299
301
} while (0)
300
302
@@ -306,20 +308,22 @@ do { \
306
308
? it->parsed_hdr->nchunks \
307
309
: 1; \
308
310
if (state & HPACK_FLAGS_HUFFMAN_VALUE) { \
309
- BUFFER_GET(length, it); \
311
+ unsigned long len = length + (length >> 1); \
312
+ \
313
+ BUFFER_GET(len, it); \
310
314
if (!it->pos) { \
311
315
r = -ENOMEM; \
312
316
goto out; \
313
317
} \
314
318
if (!TFW_STR_EMPTY(&it->hdr)) { \
315
319
it->next = tfw_hpack_exp_hdr(req->pool, \
316
- length , it); \
320
+ len , it); \
317
321
if (!it->next) { \
318
322
r = -ENOMEM; \
319
323
goto out; \
320
324
} \
321
325
} else { \
322
- BUFFER_HDR_INIT(length , it); \
326
+ BUFFER_HDR_INIT(len , it); \
323
327
} \
324
328
} \
325
329
} while (0)
@@ -497,14 +501,28 @@ huffman_decode_tail(TfwHPack *__restrict hp, TfwHttpReq *__restrict req,
497
501
unsigned int i ;
498
502
int r ;
499
503
504
+ #define ADJUST_EXTRA_RSPACE (req ) \
505
+ do { \
506
+ TfwMsgParseIter *it = &req->pit; \
507
+ TfwStr *hdr = &it->hdr; \
508
+ TfwStr *last = TFW_STR_LAST(hdr); \
509
+ \
510
+ hdr->len -= it->rspace; \
511
+ if (!TFW_STR_PLAIN(hdr)) \
512
+ last->len -= it->rspace; \
513
+ it->rspace = 0; \
514
+ } while (0)
515
+
500
516
for (;;) {
501
517
int shift ;
502
518
503
519
if (hp -> curr == - HT_NBITS ) {
504
- if (likely (offset == 0 ))
520
+ if (likely (offset == 0 )) {
521
+ ADJUST_EXTRA_RSPACE (req );
505
522
return T_OK ;
506
- else
523
+ } else {
507
524
return T_COMPRESSION ;
525
+ }
508
526
}
509
527
510
528
i = (hp -> hctx << - hp -> curr ) & HT_NMASK ;
@@ -532,7 +550,8 @@ huffman_decode_tail(TfwHPack *__restrict hp, TfwHttpReq *__restrict req,
532
550
if (likely (offset == 0 )) {
533
551
if ((i ^ (HT_EOS_HIGH >> 1 )) <
534
552
(1U << - hp -> curr )) {
535
- return 0 ;
553
+ ADJUST_EXTRA_RSPACE (req );
554
+ return T_OK ;
536
555
}
537
556
}
538
557
/*
@@ -558,10 +577,13 @@ huffman_decode_tail(TfwHPack *__restrict hp, TfwHttpReq *__restrict req,
558
577
}
559
578
if (likely (offset == 0 )) {
560
579
if ((i ^ (HT_EOS_HIGH >> 1 )) < (1U << - hp -> curr )) {
580
+ ADJUST_EXTRA_RSPACE (req );
561
581
return T_OK ;
562
582
}
563
583
}
564
584
return T_COMPRESSION ;
585
+
586
+ #undef ADJUST_EXTRA_RSPACE
565
587
}
566
588
567
589
static int
0 commit comments