@@ -377,6 +377,8 @@ static int chunked_data_size(char *buf, size_t length,
377377{
378378 char * cursor ;
379379 char * line_end ;
380+ int extension_started ;
381+ size_t digit ;
380382 size_t digit_count ;
381383 size_t line_length ;
382384 size_t total_size ;
@@ -400,22 +402,28 @@ static int chunked_data_size(char *buf, size_t length,
400402
401403 errno = 0 ;
402404 digit_count = 0 ;
405+ extension_started = FLB_FALSE ;
403406 value = 0 ;
404407
405408 while (digit_count < line_length ) {
406409 if (* cursor >= '0' && * cursor <= '9' ) {
407- value = ( value * 16 ) + ( * cursor - '0' ) ;
410+ digit = * cursor - '0' ;
408411 }
409412 else if (* cursor >= 'a' && * cursor <= 'f' ) {
410- value = ( value * 16 ) + (* cursor - 'a' ) + 10 ;
413+ digit = (* cursor - 'a' ) + 10 ;
411414 }
412415 else if (* cursor >= 'A' && * cursor <= 'F' ) {
413- value = ( value * 16 ) + (* cursor - 'A' ) + 10 ;
416+ digit = (* cursor - 'A' ) + 10 ;
414417 }
415418 else {
416419 break ;
417420 }
418421
422+ if (value > ((SIZE_MAX - digit ) / 16 )) {
423+ return FLB_HTTP_ERROR ;
424+ }
425+
426+ value = (value * 16 ) + digit ;
419427 digit_count ++ ;
420428 cursor ++ ;
421429 }
@@ -432,10 +440,23 @@ static int chunked_data_size(char *buf, size_t length,
432440 if (digit_count < line_length && * cursor == ';' ) {
433441 cursor ++ ;
434442 digit_count ++ ;
443+ extension_started = FLB_TRUE ;
435444 }
436445
437446 while (digit_count < line_length ) {
438- if (* cursor == '\0' ) {
447+ if (extension_started == FLB_FALSE ) {
448+ if (* cursor != ' ' && * cursor != '\t' ) {
449+ return FLB_HTTP_ERROR ;
450+ }
451+ }
452+ else if (* cursor != ' ' && * cursor != '\t' && * cursor != ';' &&
453+ * cursor != '=' && * cursor != '"' && * cursor != '\\' &&
454+ * cursor != '/' && * cursor != ',' && * cursor != '_' &&
455+ * cursor != '-' && * cursor != '.' && * cursor != ':' &&
456+ * cursor != '(' && * cursor != ')' &&
457+ !(* cursor >= '0' && * cursor <= '9' ) &&
458+ !(* cursor >= 'a' && * cursor <= 'z' ) &&
459+ !(* cursor >= 'A' && * cursor <= 'Z' )) {
439460 return FLB_HTTP_ERROR ;
440461 }
441462
@@ -449,12 +470,20 @@ static int chunked_data_size(char *buf, size_t length,
449470 return FLB_HTTP_OK ;
450471 }
451472
473+ if (value > (SIZE_MAX - total_size - 2 )) {
474+ return FLB_HTTP_ERROR ;
475+ }
476+
452477 total_size += value + 2 ;
453478
454479 if (length < total_size ) {
455480 return FLB_HTTP_MORE ;
456481 }
457482
483+ if (value > (length - ((line_end + 2 ) - buf ) - 2 )) {
484+ return FLB_HTTP_MORE ;
485+ }
486+
458487 if (line_end [2 + value ] != '\r' || line_end [3 + value ] != '\n' ) {
459488 return FLB_HTTP_ERROR ;
460489 }
0 commit comments