Skip to content

Commit bd507b3

Browse files
committed
http_client: reject invalid chunked size lines
Signed-off-by: Eduardo Silva <eduardo@chronosphere.io>
1 parent a9dcba9 commit bd507b3

1 file changed

Lines changed: 33 additions & 4 deletions

File tree

src/flb_http_client.c

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)