Skip to content

Commit 6f52254

Browse files
committed
guard integer overflow and unbounded sizes
1 parent 72998a5 commit 6f52254

3 files changed

Lines changed: 18 additions & 7 deletions

File tree

src/json/centijson_sax.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,12 @@ json_buf_append(JSON_PARSER* parser, const unsigned char* data, size_t size)
311311
{
312312
if(parser->buf_used + size > parser->buf_alloced) {
313313
unsigned char* new_buf;
314-
size_t new_alloced = (parser->buf_used + size) * 2;
314+
size_t new_alloced;
315+
if(parser->buf_used > SIZE_MAX / 2 || size > SIZE_MAX / 2 - parser->buf_used) {
316+
json_raise(parser, JSON_ERR_OUTOFMEMORY);
317+
WOLFSENTRY_RETURN_VALUE(-1);
318+
}
319+
new_alloced = (parser->buf_used + size) * 2;
315320

316321
new_buf = (unsigned char *)realloc(parser->buf, new_alloced);
317322
if(new_buf == NULL) {

src/routes.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,6 +1955,8 @@ static wolfsentry_errcode_t wolfsentry_route_lookup_1(
19551955
const size_t addr_buf_size = WOLFSENTRY_BITS_TO_BYTES(remote->addr_len) + WOLFSENTRY_BITS_TO_BYTES(local->addr_len);
19561956
struct wolfsentry_route *target;
19571957

1958+
if (addr_buf_size > (size_t)WOLFSENTRY_MAX_ADDR_BYTES * 2)
1959+
WOLFSENTRY_ERROR_RETURN(NUMERIC_ARG_TOO_BIG);
19581960
target = (struct wolfsentry_route *)alloca(sizeof(*target) + addr_buf_size);
19591961
#define LOOKUP_TARGET target
19601962
#endif
@@ -4012,24 +4014,26 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_route_flag_assoc_by_name(const ch
40124014

40134015
static wolfsentry_errcode_t ws_itoa(int i, unsigned char **out, size_t *spc) {
40144016
int out_chars;
4015-
int digit_thresh;
4017+
unsigned int u;
4018+
unsigned int digit_thresh;
40164019
int neg;
40174020
if (i < 0) {
40184021
neg = 1;
4019-
i = -i;
4022+
u = -(unsigned int)i;
40204023
out_chars = 2;
40214024
} else {
40224025
neg = 0;
4026+
u = (unsigned int)i;
40234027
out_chars = 1;
40244028
}
40254029
for (digit_thresh = 10; ; digit_thresh *= 10) {
4026-
if (i >= digit_thresh)
4030+
if (u >= digit_thresh)
40274031
++out_chars;
40284032
else {
40294033
digit_thresh /= 10;
40304034
break;
40314035
}
4032-
if (digit_thresh == 1000000000)
4036+
if (digit_thresh == 1000000000U)
40334037
break;
40344038
}
40354039
if (*spc < (size_t)out_chars)
@@ -4038,8 +4042,8 @@ static wolfsentry_errcode_t ws_itoa(int i, unsigned char **out, size_t *spc) {
40384042
if (neg)
40394043
*(*out)++ = '-';
40404044
while (digit_thresh >= 1) {
4041-
int quotient = i / digit_thresh;
4042-
i %= digit_thresh;
4045+
unsigned int quotient = u / digit_thresh;
4046+
u %= digit_thresh;
40434047
digit_thresh /= 10;
40444048
*(*out)++ = (unsigned char)('0' + quotient);
40454049
}

src/wolfsentry_util.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3617,6 +3617,8 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_eventconfig_check(
36173617
((config->route_private_data_alignment & (config->route_private_data_alignment - 1)) != 0) ||
36183618
(config->route_private_data_alignment > config->route_private_data_size)))
36193619
WOLFSENTRY_ERROR_RETURN(INVALID_ARG);
3620+
if (config->route_private_data_size > MAX_UINT_OF(((struct wolfsentry_route *)0)->data_addr_offset))
3621+
WOLFSENTRY_ERROR_RETURN(NUMERIC_ARG_TOO_BIG);
36203622
}
36213623

36223624
if (config->route_private_data_alignment > 0) {

0 commit comments

Comments
 (0)