Skip to content

Commit af147ba

Browse files
committed
correct route table tracking and address family
1 parent ea806a1 commit af147ba

2 files changed

Lines changed: 28 additions & 16 deletions

File tree

src/addr_families.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,8 @@ static wolfsentry_errcode_t wolfsentry_addr_family_ntop_1(
773773
{ *family_name = "HYLINK"; WOLFSENTRY_RETURN_OK; }
774774
case WOLFSENTRY_AF_LINK:
775775
{ *family_name = "LINK"; WOLFSENTRY_RETURN_OK; }
776+
case WOLFSENTRY_AF_LINK64:
777+
{ *family_name = "LINK64"; WOLFSENTRY_RETURN_OK; }
776778
case WOLFSENTRY_AF_COIP:
777779
{ *family_name = "COIP"; WOLFSENTRY_RETURN_OK; }
778780
case WOLFSENTRY_AF_CNT:

src/routes.c

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -583,10 +583,10 @@ static void wolfsentry_route_update_flags_1(
583583

584584
static void wolfsentry_route_free_1(
585585
WOLFSENTRY_CONTEXT_ARGS_IN,
586-
struct wolfsentry_eventconfig_internal *config,
586+
size_t route_private_data_alignment,
587587
struct wolfsentry_route *route)
588588
{
589-
if (config->config.route_private_data_alignment == 0)
589+
if (route_private_data_alignment == 0)
590590
WOLFSENTRY_FREE(route);
591591
else
592592
WOLFSENTRY_FREE_ALIGNED(route);
@@ -599,6 +599,10 @@ static wolfsentry_errcode_t wolfsentry_route_drop_reference_1(
599599
wolfsentry_action_res_t *action_results)
600600
{
601601
struct wolfsentry_eventconfig_internal *config = (route->parent_event && route->parent_event->config) ? route->parent_event->config : &wolfsentry->config;
602+
/* snapshot the alignment before dropping the event reference, since the
603+
* event (and its config) may be freed by the drop.
604+
*/
605+
size_t route_private_data_alignment = config->config.route_private_data_alignment;
602606
wolfsentry_errcode_t ret;
603607
wolfsentry_refcount_t refs_left;
604608
if (route->header.refcount == 0)
@@ -612,7 +616,7 @@ static wolfsentry_errcode_t wolfsentry_route_drop_reference_1(
612616
WOLFSENTRY_RETURN_OK;
613617
if (route->parent_event)
614618
WOLFSENTRY_WARN_ON_FAILURE(wolfsentry_event_drop_reference(WOLFSENTRY_CONTEXT_ARGS_OUT, route->parent_event, NULL /* action_results */));
615-
wolfsentry_route_free_1(WOLFSENTRY_CONTEXT_ARGS_OUT, config, route);
619+
wolfsentry_route_free_1(WOLFSENTRY_CONTEXT_ARGS_OUT, route_private_data_alignment, route);
616620
if (action_results)
617621
WOLFSENTRY_SET_BITS(*action_results, WOLFSENTRY_ACTION_RES_DEALLOCATED);
618622
WOLFSENTRY_RETURN_OK;
@@ -995,7 +999,7 @@ static wolfsentry_errcode_t wolfsentry_route_new(
995999
WOLFSENTRY_ERROR_RETURN(SYS_RESOURCE_FAILED);
9961000
ret = wolfsentry_route_init(parent_event, remote, local, flags, (int)config->config.route_private_data_size, new_size, *new);
9971001
if (ret < 0) {
998-
wolfsentry_route_free_1(WOLFSENTRY_CONTEXT_ARGS_OUT, config, *new);
1002+
wolfsentry_route_free_1(WOLFSENTRY_CONTEXT_ARGS_OUT, config->config.route_private_data_alignment, *new);
9991003
*new = NULL;
10001004
} else {
10011005
if (parent_event != NULL) {
@@ -1054,7 +1058,7 @@ static wolfsentry_errcode_t wolfsentry_route_new_by_exports(
10541058
WOLFSENTRY_ERROR_RETURN(SYS_RESOURCE_FAILED);
10551059
ret = wolfsentry_route_init_by_exports(parent_event, route_exports, config->config.route_private_data_size, new_size, *new);
10561060
if (ret < 0) {
1057-
wolfsentry_route_free_1(WOLFSENTRY_CONTEXT_ARGS_OUT, config, *new);
1061+
wolfsentry_route_free_1(WOLFSENTRY_CONTEXT_ARGS_OUT, config->config.route_private_data_alignment, *new);
10581062
*new = NULL;
10591063
} else {
10601064
if (parent_event != NULL) {
@@ -1174,7 +1178,7 @@ WOLFSENTRY_LOCAL wolfsentry_errcode_t wolfsentry_route_clone(
11741178
#ifdef WOLFSENTRY_THREADSAFE
11751179
thread,
11761180
#endif
1177-
config, *new_route);
1181+
config->config.route_private_data_alignment, *new_route);
11781182
WOLFSENTRY_ERROR_RERETURN(ret);
11791183
}
11801184
WOLFSENTRY_REFCOUNT_INCREMENT((*new_route)->parent_event->header.refcount, ret);
@@ -1330,7 +1334,7 @@ static wolfsentry_errcode_t wolfsentry_route_insert_1(
13301334

13311335
if (route_to_insert->flags & WOLFSENTRY_ROUTE_FLAG_SA_FAMILY_WILDCARD) {
13321336
if ((route_table->last_af_wildcard_route == NULL) ||
1333-
(wolfsentry_route_key_cmp_1(route_to_insert, route_table->last_af_wildcard_route, 0 /* match_wildcards_p */, NULL /* inexact_matches */) < 0))
1337+
(wolfsentry_route_key_cmp_1(route_to_insert, route_table->last_af_wildcard_route, 0 /* match_wildcards_p */, NULL /* inexact_matches */) > 0))
13341338
{
13351339
route_table->last_af_wildcard_route = route_to_insert;
13361340
}
@@ -2162,10 +2166,19 @@ static wolfsentry_errcode_t wolfsentry_route_delete_0(
21622166
wolfsentry_route_update_flags_1(route, WOLFSENTRY_ROUTE_FLAG_NONE, WOLFSENTRY_ROUTE_FLAG_IN_TABLE, &flags_before, &flags_after);
21632167
}
21642168

2165-
if ((ret = wolfsentry_table_ent_delete_1(WOLFSENTRY_CONTEXT_ARGS_OUT, &route->header)) < 0) {
2166-
wolfsentry_route_flags_t flags_before, flags_after;
2167-
wolfsentry_route_update_flags_1(route, WOLFSENTRY_ROUTE_FLAG_IN_TABLE, WOLFSENTRY_ROUTE_FLAG_NONE, &flags_before, &flags_after);
2168-
WOLFSENTRY_ERROR_RERETURN(ret);
2169+
/* snapshot linked-list neighbor before delete_1 nullifies prev/next. */
2170+
{
2171+
struct wolfsentry_route *prev_route = (struct wolfsentry_route *)route->header.prev;
2172+
if ((ret = wolfsentry_table_ent_delete_1(WOLFSENTRY_CONTEXT_ARGS_OUT, &route->header)) < 0) {
2173+
wolfsentry_route_flags_t flags_before, flags_after;
2174+
wolfsentry_route_update_flags_1(route, WOLFSENTRY_ROUTE_FLAG_IN_TABLE, WOLFSENTRY_ROUTE_FLAG_NONE, &flags_before, &flags_after);
2175+
WOLFSENTRY_ERROR_RERETURN(ret);
2176+
}
2177+
if (route_table->last_af_wildcard_route == route) {
2178+
while (prev_route && ! (prev_route->flags & WOLFSENTRY_ROUTE_FLAG_SA_FAMILY_WILDCARD))
2179+
prev_route = (struct wolfsentry_route *)prev_route->header.prev;
2180+
route_table->last_af_wildcard_route = prev_route;
2181+
}
21692182
}
21702183

21712184
#ifdef WOLFSENTRY_ADDR_BITMASK_MATCHING
@@ -2191,9 +2204,6 @@ static wolfsentry_errcode_t wolfsentry_route_delete_0(
21912204
WOLFSENTRY_WARN("wolfsentry_action_list_dispatch for wolfsentry_route_delete_0 returned " WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(ret));
21922205
}
21932206

2194-
if (route_table->last_af_wildcard_route == route)
2195-
route_table->last_af_wildcard_route = (struct wolfsentry_route *)route->header.prev;
2196-
21972207
{
21982208
wolfsentry_priority_t effective_priority = route->parent_event ? route->parent_event->priority : 0;
21992209
if (effective_priority == route_table->highest_priority_route_in_table) {
@@ -3904,7 +3914,7 @@ WOLFSENTRY_API wolfsentry_errcode_t wolfsentry_route_format_address(
39043914
WOLFSENTRY_RETURN_OK;
39053915
}
39063916

3907-
if (sa_family == WOLFSENTRY_AF_LINK) {
3917+
if (sa_family == WOLFSENTRY_AF_LINK || sa_family == WOLFSENTRY_AF_LINK64) {
39083918
unsigned int i;
39093919
if ((addr_bits >> 3) * 3 > (size_t)*buflen)
39103920
WOLFSENTRY_ERROR_RETURN(BUFFER_TOO_SMALL);
@@ -4431,7 +4441,7 @@ static wolfsentry_errcode_t wolfsentry_route_render_address(WOLFSENTRY_CONTEXT_A
44314441
WOLFSENTRY_RETURN_OK;
44324442
}
44334443

4434-
if (sa_family == WOLFSENTRY_AF_LINK) {
4444+
if (sa_family == WOLFSENTRY_AF_LINK || sa_family == WOLFSENTRY_AF_LINK64) {
44354445
unsigned int i;
44364446
for (i=0; i < (addr_bits >> 3); ++i) {
44374447
if (fprintf(f, "%s%02x", i ? ":" : "", (unsigned int)addr[i]) < 0)

0 commit comments

Comments
 (0)