Skip to content

Commit 066f3e2

Browse files
authored
Merge pull request #80 from JeremiahM37/fenrir-fixes
Fenrir fixes
2 parents e515ae3 + f936ad7 commit 066f3e2

9 files changed

Lines changed: 111 additions & 64 deletions

File tree

src/addr_families.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ WOLFSENTRY_LOCAL wolfsentry_errcode_t wolfsentry_addr_family_clone(
324324
if ((*new_bynumber = (struct wolfsentry_addr_family_bynumber *)WOLFSENTRY_MALLOC_1(dest_context->hpi.allocator, sizeof **new_bynumber)) == NULL)
325325
WOLFSENTRY_ERROR_RETURN(SYS_RESOURCE_FAILED);
326326
if ((*new_byname = (struct wolfsentry_addr_family_byname *)WOLFSENTRY_MALLOC_1(dest_context->hpi.allocator, byname_size)) == NULL) {
327-
(void)WOLFSENTRY_FREE_1(dest_context->hpi.allocator, (void *)new_byname);
327+
(void)WOLFSENTRY_FREE_1(dest_context->hpi.allocator, (void *)*new_bynumber);
328328
WOLFSENTRY_ERROR_RETURN(SYS_RESOURCE_FAILED);
329329
}
330330
memcpy(*new_bynumber, src_bynumber, sizeof **new_bynumber);

src/json/centijson_dom.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,17 @@ json_dom_process(JSON_TYPE type, const unsigned char* data, size_t data_size, vo
266266
* append their json_values. */
267267
if(dom_parser->path_size >= dom_parser->path_alloc) {
268268
JSON_VALUE** new_path;
269-
size_t new_path_alloc = dom_parser->path_alloc * 2;
269+
size_t new_path_alloc;
270270

271-
if(new_path_alloc == 0)
271+
if(dom_parser->path_alloc == 0) {
272272
new_path_alloc = 32;
273+
}
274+
else if(dom_parser->path_alloc > SIZE_MAX / 2 / sizeof(JSON_VALUE*)) {
275+
return JSON_ERR_OUTOFMEMORY;
276+
}
277+
else {
278+
new_path_alloc = dom_parser->path_alloc * 2;
279+
}
273280
new_path = (JSON_VALUE**) realloc((void *)dom_parser->path, new_path_alloc * sizeof(JSON_VALUE*));
274281
if(new_path == NULL)
275282
return JSON_ERR_OUTOFMEMORY;
@@ -617,8 +624,14 @@ json_dom_dump_helper(
617624
keys_size = json_value_dict_keys_ordered(node, keys, n);
618625
else
619626
keys_size = json_value_dict_keys_sorted(node, keys, n);
620-
if (keys_size != n)
627+
if (keys_size != n) {
628+
#ifdef WOLFSENTRY
629+
json_free(WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator), (void *)keys);
630+
#else
631+
free((void *)keys);
632+
#endif
621633
return JSON_ERR_INTERNAL;
634+
}
622635

623636
for(i = 0; i < n; i++) {
624637
JSON_VALUE* json_value;

src/json/centijson_sax.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -857,10 +857,11 @@ json_feed(JSON_PARSER* parser, const unsigned char* input, size_t size)
857857
{
858858
/* Update parser->pos to point to the exact place. */
859859
while(parser->pos.offset < parser->config.max_total_len) {
860+
ch = input[off];
861+
off++;
860862
parser->pos.offset++;
861863
parser->pos.column_number++;
862-
off++;
863-
json_handle_new_line(parser, input[off]);
864+
json_handle_new_line(parser, ch);
864865
}
865866

866867
json_raise(parser, JSON_ERR_MAXTOTALLEN);
@@ -891,10 +892,18 @@ json_feed(JSON_PARSER* parser, const unsigned char* input, size_t size)
891892

892893
if(parser->nesting_level >= parser->nesting_stack_size) {
893894
unsigned char* new_nesting_stack;
894-
size_t new_nesting_stack_size = parser->nesting_stack_size * 2;
895+
size_t new_nesting_stack_size;
895896

896-
if(new_nesting_stack_size == 0)
897+
if(parser->nesting_stack_size == 0) {
897898
new_nesting_stack_size = 32;
899+
}
900+
else if(parser->nesting_stack_size > SIZE_MAX / 2) {
901+
json_raise(parser, JSON_ERR_OUTOFMEMORY);
902+
break;
903+
}
904+
else {
905+
new_nesting_stack_size = parser->nesting_stack_size * 2;
906+
}
898907
new_nesting_stack = (unsigned char *)realloc(parser->nesting_stack, new_nesting_stack_size);
899908
if(new_nesting_stack == NULL) {
900909
json_raise(parser, JSON_ERR_OUTOFMEMORY);

src/json/centijson_value.c

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,15 +1794,21 @@ json_value_dict_clean(
17941794
WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator),
17951795
#endif
17961796
&node->key);
1797-
if (ret < 0)
1797+
if (ret < 0) {
1798+
free(node);
1799+
free((void *)stack);
17981800
return ret;
1801+
}
17991802
ret = json_value_fini(
18001803
#ifdef WOLFSENTRY
18011804
WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator),
18021805
#endif
18031806
&node->json_value);
1804-
if (ret < 0)
1807+
if (ret < 0) {
1808+
free(node);
1809+
free((void *)stack);
18051810
return ret;
1811+
}
18061812
free(node);
18071813

18081814
stack_size += json_value_dict_leftmost_path(stack + stack_size, right);
@@ -1928,40 +1934,40 @@ json_value_clone(WOLFSENTRY_CONTEXT_ARGS_IN_EX(struct wolfsentry_allocator *allo
19281934
break;
19291935
}
19301936
ret = json_value_clone(WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator), &src_dict_node->json_value, dest_node);
1937+
if (ret < 0)
1938+
break;
19311939
src_dict_node = src_dict_node->order_next;
19321940
}
19331941
} else {
19341942
int stack_size;
19351943
RBTREE **stack = (RBTREE **)malloc(rbtree_stack_size_needed(src_dict)); /* put this on the heap to avoid runaway growth of stack on deep JSON trees. */
19361944
if (! stack) {
19371945
ret = JSON_ERR_OUTOFMEMORY;
1938-
break;
1939-
}
1940-
1941-
stack_size = json_value_dict_leftmost_path(stack, src_dict->root);
1942-
1943-
while(stack_size > 0) {
1944-
src_dict_node = stack[--stack_size];
1945-
dest_node = json_value_dict_get_or_add_(WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator), clone, json_value_string(&src_dict_node->key), json_value_string_length(&src_dict_node->key));
1946-
if (! dest_node) {
1947-
ret = JSON_ERR_OUTOFMEMORY;
1948-
break;
1946+
} else {
1947+
stack_size = json_value_dict_leftmost_path(stack, src_dict->root);
1948+
1949+
while(stack_size > 0) {
1950+
src_dict_node = stack[--stack_size];
1951+
dest_node = json_value_dict_get_or_add_(WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator), clone, json_value_string(&src_dict_node->key), json_value_string_length(&src_dict_node->key));
1952+
if (! dest_node) {
1953+
ret = JSON_ERR_OUTOFMEMORY;
1954+
break;
1955+
}
1956+
ret = json_value_clone(WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator), &src_dict_node->json_value, dest_node);
1957+
if (ret < 0)
1958+
break;
1959+
stack_size += json_value_dict_leftmost_path(stack + stack_size, src_dict_node->right);
19491960
}
1950-
ret = json_value_clone(WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator), &src_dict_node->json_value, dest_node);
1951-
if (ret < 0)
1952-
break;
1953-
stack_size += json_value_dict_leftmost_path(stack + stack_size, src_dict_node->right);
1954-
}
1955-
1956-
free((void *)stack);
19571961

1958-
break;
1962+
free((void *)stack);
1963+
}
19591964
}
19601965
if (ret < 0) {
19611966
int ret2 = json_value_fini(WOLFSENTRY_CONTEXT_ARGS_OUT_EX(allocator), clone);
19621967
if (ret2 < 0)
19631968
WOLFSENTRY_WARN("json_value_fini: %s\n", json_error_str(ret2));
19641969
}
1970+
break;
19651971
}
19661972
}
19671973

src/json/load_config.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define WOLFSENTRY_SOURCE_ID WOLFSENTRY_SOURCE_ID_JSON_LOAD_CONFIG_C
2727

2828
#include <stdlib.h>
29+
#include <limits.h>
2930

3031
#define MAX_IPV4_ADDR_BITS (sizeof(struct in_addr) * BITS_PER_BYTE)
3132
#define MAX_IPV6_ADDR_BITS (sizeof(struct in6_addr) * BITS_PER_BYTE)
@@ -384,12 +385,18 @@ static wolfsentry_errcode_t convert_wolfsentry_duration(struct wolfsentry_contex
384385

385386
switch (*endptr) {
386387
case 'd':
388+
if (conv > LONG_MAX / 24 || conv < LONG_MIN / 24)
389+
WOLFSENTRY_ERROR_RETURN(CONFIG_INVALID_VALUE);
387390
conv *= 24;
388391
/* fallthrough */
389392
case 'h':
393+
if (conv > LONG_MAX / 60 || conv < LONG_MIN / 60)
394+
WOLFSENTRY_ERROR_RETURN(CONFIG_INVALID_VALUE);
390395
conv *= 60;
391396
/* fallthrough */
392397
case 'm':
398+
if (conv > LONG_MAX / 60 || conv < LONG_MIN / 60)
399+
WOLFSENTRY_ERROR_RETURN(CONFIG_INVALID_VALUE);
393400
conv *= 60;
394401
/* fallthrough */
395402
case 's':
@@ -1968,7 +1975,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_config_json_fini(
19681975
struct wolfsentry_route_table *old_route_table, *new_route_table;
19691976
if ((ret = wolfsentry_route_get_main_table(JPSP_WOLFSENTRY_ACTUAL_CONTEXT_ARGS_OUT, &old_route_table)) < 0)
19701977
goto out;
1971-
if ((ret = wolfsentry_route_get_main_table(JPSP_WOLFSENTRY_ACTUAL_CONTEXT_ARGS_OUT, &new_route_table)) < 0)
1978+
if ((ret = wolfsentry_route_get_main_table(JPSP_WOLFSENTRY_CONTEXT_ARGS_OUT, &new_route_table)) < 0)
19721979
goto out;
19731980
if (wolfsentry_table_n_deletes((struct wolfsentry_table_header *)new_route_table)
19741981
!= wolfsentry_table_n_deletes((struct wolfsentry_table_header *)old_route_table))

src/kv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1054,7 +1054,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_user_value_get_json(
10541054
struct wolfsentry_kv_pair_internal **user_value_record)
10551055
{
10561056
wolfsentry_errcode_t ret;
1057-
if ((ret = wolfsentry_kv_get_reference(WOLFSENTRY_CONTEXT_ARGS_OUT, wolfsentry->user_values, key, key_len, WOLFSENTRY_KV_STRING, user_value_record)) < 0)
1057+
if ((ret = wolfsentry_kv_get_reference(WOLFSENTRY_CONTEXT_ARGS_OUT, wolfsentry->user_values, key, key_len, WOLFSENTRY_KV_JSON, user_value_record)) < 0)
10581058
WOLFSENTRY_ERROR_RERETURN(ret);
10591059
*value = WOLFSENTRY_KV_V_JSON(&(*user_value_record)->kv);
10601060
WOLFSENTRY_RETURN_OK;

src/lwip/packet_filter_glue.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,10 +1098,10 @@ static err_t icmp6_filter_with_wolfsentry(
10981098
else
10991099
memset(&local.local.addr, 0, sizeof *laddr);
11001100

1101-
remote.remote.sa_proto = IPPROTO_ICMP;
1101+
remote.remote.sa_proto = IPPROTO_ICMPV6;
11021102
remote.remote.sa_port = 0;
11031103

1104-
local.local.sa_proto = IPPROTO_ICMP;
1104+
local.local.sa_proto = IPPROTO_ICMPV6;
11051105
local.local.sa_port = icmp6_type;
11061106

11071107
if (event->netif)

src/routes.c

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ static int compare_match_exactness(const struct wolfsentry_route *target, const
520520
} else
521521
#endif
522522
{
523-
right_match_score = addr_prefix_match_size(WOLFSENTRY_ROUTE_LOCAL_ADDR(target), WOLFSENTRY_ROUTE_LOCAL_ADDR_BITS(target), WOLFSENTRY_ROUTE_LOCAL_ADDR(right), WOLFSENTRY_ROUTE_LOCAL_ADDR_BITS(right));
523+
right_match_score = addr_prefix_match_size(WOLFSENTRY_ROUTE_REMOTE_ADDR(target), WOLFSENTRY_ROUTE_REMOTE_ADDR_BITS(target), WOLFSENTRY_ROUTE_REMOTE_ADDR(right), WOLFSENTRY_ROUTE_REMOTE_ADDR_BITS(right));
524524
}
525525
}
526526

@@ -2366,6 +2366,9 @@ static wolfsentry_errcode_t wolfsentry_route_event_dispatch_0(
23662366
wolfsentry_route_flags_t current_rule_route_flags;
23672367
wolfsentry_errcode_t ret;
23682368
wolfsentry_time_t now;
2369+
int penalty_triggered = 0;
2370+
wolfsentry_hitcount_t derog_snap;
2371+
wolfsentry_hitcount_t commend_snap;
23692372

23702373
if (target_route == NULL)
23712374
WOLFSENTRY_ERROR_RETURN(INVALID_ARG);
@@ -2553,18 +2556,25 @@ static wolfsentry_errcode_t wolfsentry_route_event_dispatch_0(
25532556
}
25542557
}
25552558

2559+
/* Snapshot atomic counts once so the guard and arithmetic operate on the
2560+
* same values (avoid TOCTOU between successive loads). */
2561+
derog_snap = WOLFSENTRY_ATOMIC_LOAD(rule_route->meta.derogatory_count);
2562+
commend_snap = WOLFSENTRY_ATOMIC_LOAD(rule_route->meta.commendable_count);
2563+
if (config->config.derogatory_threshold_for_penaltybox > 0) {
2564+
if (config->config.flags & WOLFSENTRY_EVENTCONFIG_FLAG_DEROGATORY_THRESHOLD_IGNORE_COMMENDABLE) {
2565+
penalty_triggered = (derog_snap >= config->config.derogatory_threshold_for_penaltybox);
2566+
} else {
2567+
penalty_triggered = (derog_snap >= commend_snap)
2568+
&& ((derog_snap - commend_snap)
2569+
>= config->config.derogatory_threshold_for_penaltybox);
2570+
}
2571+
}
2572+
25562573
if (current_rule_route_flags & WOLFSENTRY_ROUTE_FLAG_PENALTYBOXED) {
25572574
*action_results |= WOLFSENTRY_ACTION_RES_REJECT;
25582575
ret = WOLFSENTRY_ERROR_ENCODE(OK);
25592576
goto done;
2560-
} else if ((config->config.derogatory_threshold_for_penaltybox > 0)
2561-
&& ((config->config.flags & WOLFSENTRY_EVENTCONFIG_FLAG_DEROGATORY_THRESHOLD_IGNORE_COMMENDABLE) ?
2562-
(WOLFSENTRY_ATOMIC_LOAD(rule_route->meta.derogatory_count)
2563-
>= config->config.derogatory_threshold_for_penaltybox)
2564-
:
2565-
(WOLFSENTRY_ATOMIC_LOAD(rule_route->meta.derogatory_count)
2566-
- WOLFSENTRY_ATOMIC_LOAD(rule_route->meta.commendable_count)
2567-
>= (int)config->config.derogatory_threshold_for_penaltybox)))
2577+
} else if (penalty_triggered)
25682578
{
25692579
wolfsentry_route_flags_t flags_before;
25702580
WOLFSENTRY_WARN_ON_FAILURE(
@@ -2961,6 +2971,10 @@ static wolfsentry_errcode_t wolfsentry_route_event_dispatch_by_route_1(
29612971
goto out;
29622972
}
29632973

2974+
if (route->header.parent_table == NULL) {
2975+
ret = WOLFSENTRY_ERROR_ENCODE(INTERNAL_CHECK_FATAL);
2976+
goto out;
2977+
}
29642978
if (route->header.parent_table->ent_type != WOLFSENTRY_OBJECT_TYPE_ROUTE) {
29652979
ret = WOLFSENTRY_ERROR_ENCODE(WRONG_OBJECT);
29662980
goto out;
@@ -3095,7 +3109,7 @@ static wolfsentry_errcode_t wolfsentry_route_stale_purge_1(
30953109
(! (route->flags & WOLFSENTRY_ROUTE_FLAG_PENDING_DELETE)) &&
30963110
((table->max_purgeable_idle_time == 0) || (now - route->meta.last_hit_time > table->max_purgeable_idle_time)))
30973111
{
3098-
continue;
3112+
break;
30993113
}
31003114
}
31013115
#ifdef WOLFSENTRY_THREADSAFE
@@ -3545,9 +3559,9 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_route_table_get_default_event(
35453559
char *event_label,
35463560
int *event_label_len)
35473561
{
3548-
if (table->default_event == NULL)
3549-
WOLFSENTRY_ERROR_RETURN(ITEM_NOT_FOUND);
35503562
WOLFSENTRY_SHARED_OR_RETURN();
3563+
if (table->default_event == NULL)
3564+
WOLFSENTRY_ERROR_UNLOCK_AND_RETURN(ITEM_NOT_FOUND);
35513565
if (table->default_event->label_len >= *event_label_len)
35523566
WOLFSENTRY_ERROR_UNLOCK_AND_RETURN(BUFFER_TOO_SMALL);
35533567
memcpy(event_label, table->default_event->label, (size_t)(table->default_event->label_len + 1));
@@ -3776,7 +3790,7 @@ WOLFSENTRY_API int wolfsentry_inet6_ntoa(const byte *addr, unsigned int addr_bit
37763790
int i;
37773791
const char *start_buf = buf;
37783792
int this_zerospan_length = 0;
3779-
int this_zerospan_offset;
3793+
int this_zerospan_offset = 0;
37803794
int longest_zerospan_length = 0;
37813795
int longest_zerospan_offset = 0;
37823796

@@ -4433,8 +4447,6 @@ static wolfsentry_errcode_t wolfsentry_route_render_address(WOLFSENTRY_CONTEXT_A
44334447
int fmt_buf_len = (int)sizeof(fmt_buf);
44344448
int ret = wolfsentry_inet6_ntoa(addr, addr_bits, fmt_buf, &fmt_buf_len);
44354449
WOLFSENTRY_RERETURN_IF_ERROR(ret);
4436-
if (fprintf(f, "%.*s/%u", fmt_buf_len, fmt_buf, addr_bits) < 0)
4437-
WOLFSENTRY_ERROR_RETURN(IO_FAILED);
44384450
if (fprintf(f, "[%.*s]/%u", fmt_buf_len, fmt_buf, addr_bits) < 0)
44394451
WOLFSENTRY_ERROR_RETURN(IO_FAILED);
44404452
} else if (sa_family == WOLFSENTRY_AF_LOCAL) {
@@ -4517,7 +4529,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_route_render_flags(wolfsentry_rou
45174529
} else
45184530
already = 1;
45194531
if (rendername == NULL) {
4520-
if (fprintf(stderr, "unk-0x%x", masked_flags) < 0)
4532+
if (fprintf(f, "unk-0x%x", masked_flags) < 0)
45214533
WOLFSENTRY_ERROR_RETURN(IO_FAILED);
45224534
} else {
45234535
if (fputs(rendername, f) < 0)
@@ -4536,7 +4548,7 @@ static wolfsentry_errcode_t wolfsentry_route_render_endpoint(WOLFSENTRY_CONTEXT_
45364548
const byte *addr = (sa_local_p ? WOLFSENTRY_ROUTE_LOCAL_ADDR(r) : WOLFSENTRY_ROUTE_REMOTE_ADDR(r));
45374549

45384550
if (sa_local_p ? (r->flags & WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_ADDR_WILDCARD) : (r->flags & WOLFSENTRY_ROUTE_FLAG_SA_REMOTE_ADDR_WILDCARD)) {
4539-
if (fputs("*", stdout) < 0)
4551+
if (fputs("*", f) < 0)
45404552
WOLFSENTRY_ERROR_RETURN(IO_FAILED);
45414553
}
45424554
#ifdef WOLFSENTRY_ADDR_BITMASK_MATCHING
@@ -4642,7 +4654,7 @@ static wolfsentry_errcode_t wolfsentry_route_exports_render_endpoint(WOLFSENTRY_
46424654
const byte *addr = (sa_local_p ? r->local_address : r->remote_address);
46434655

46444656
if (sa_local_p ? (r->flags & WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_ADDR_WILDCARD) : (r->flags & WOLFSENTRY_ROUTE_FLAG_SA_REMOTE_ADDR_WILDCARD)) {
4645-
if (fputs("*", stdout) < 0)
4657+
if (fputs("*", f) < 0)
46464658
WOLFSENTRY_ERROR_RETURN(IO_FAILED);
46474659
}
46484660
#ifdef WOLFSENTRY_ADDR_BITMASK_MATCHING

0 commit comments

Comments
 (0)