Fix prefix address range parsing

This solves #65
This commit is contained in:
Job Snijders
2022-09-07 12:48:06 +00:00
parent ab683d75d5
commit 5507267c63
2 changed files with 21 additions and 32 deletions

View File

@@ -229,7 +229,7 @@ bgpq_expander_add_prefix(struct bgpq_expander *b, char *prefix)
sx_radix_tree_insert(b->tree, p); sx_radix_tree_insert(b->tree, p);
if (p) if (p)
sx_prefix_destroy(p); sx_prefix_free(p);
return 1; return 1;
} }
@@ -1113,7 +1113,7 @@ sx_radix_node_freeall(struct sx_radix_node *n) {
if (n->payload) if (n->payload)
free(n->payload); free(n->payload);
sx_prefix_destroy(n->prefix); sx_prefix_free(n->prefix);
free(n); free(n);
} }

View File

@@ -259,28 +259,19 @@ sx_prefix_setbit(struct sx_prefix *p, int n)
static int static int
sx_radix_tree_insert_specifics(struct sx_radix_tree *t, struct sx_prefix *p, sx_radix_tree_insert_specifics(struct sx_radix_tree *t, struct sx_prefix p,
unsigned min, unsigned max) unsigned min, unsigned max)
{ {
struct sx_prefix *np; if (p.masklen >= min)
struct sx_radix_node *nn; sx_radix_tree_insert(t, &p);
np = sx_prefix_alloc(p); if (p.masklen + 1 > max)
if (np->masklen >= min) {
nn = sx_radix_tree_insert(t, np);
sx_prefix_free(np);
np = nn->prefix;
}
if (np->masklen + 1 > max)
return 1; return 1;
p.masklen += 1;
np->masklen += 1; sx_radix_tree_insert_specifics(t, p, min, max);
sx_radix_tree_insert_specifics(t, np, min, max); sx_prefix_setbit(&p, p.masklen);
sx_prefix_setbit(np, np->masklen); sx_radix_tree_insert_specifics(t, p, min, max);
sx_radix_tree_insert_specifics(t, np, min, max);
return 1; return 1;
} }
@@ -289,18 +280,16 @@ int
sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen, sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
char *text) char *text)
{ {
char *d = strchr(text, '^'); struct sx_prefix p;
struct sx_prefix *p;
unsigned long min, max = 0; unsigned long min, max = 0;
char *d = strchr(text, '^');
p = sx_prefix_alloc(NULL);
if (!d || !d[1]) if (!d || !d[1])
return 0; return 0;
*d = 0; *d = 0;
if (!sx_prefix_parse(p, 0, text)) { if (!sx_prefix_parse(&p, 0, text)) {
sx_report(SX_ERROR, "Unable to parse prefix %s^%s\n", text, sx_report(SX_ERROR, "Unable to parse prefix %s^%s\n", text,
d + 1); d + 1);
return 0; return 0;
@@ -308,23 +297,23 @@ sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
*d = '^'; *d = '^';
if (af && p->family != af) { if (af && p.family != af) {
sx_report(SX_ERROR, "Ignoring prefix %s, wrong af %i\n", text, sx_report(SX_ERROR, "Ignoring prefix %s, wrong af %i\n", text,
p->family); p.family);
return 0; return 0;
} }
if (maxlen && p->masklen > maxlen) { if (maxlen && p.masklen > maxlen) {
SX_DEBUG(debug_expander, "Ignoring prefix %s, masklen %i > max" SX_DEBUG(debug_expander, "Ignoring prefix %s, masklen %i > max"
" masklen %u\n", text, p->masklen, maxlen); " masklen %u\n", text, p.masklen, maxlen);
return 0; return 0;
} }
if (d[1] == '-') { if (d[1] == '-') {
min = p->masklen + 1; min = p.masklen + 1;
max = maxlen; max = maxlen;
} else if (d[1] == '+') { } else if (d[1] == '+') {
min = p->masklen; min = p.masklen;
max = maxlen; max = maxlen;
} else if (isdigit(d[1])) { } else if (isdigit(d[1])) {
char *dm = NULL; char *dm = NULL;
@@ -341,9 +330,9 @@ sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
return 0; return 0;
} }
if (min < p->masklen) { if (min < p.masklen) {
sx_report(SX_ERROR, "Invalid prefix-range %s: min %lu < " sx_report(SX_ERROR, "Invalid prefix-range %s: min %lu < "
"masklen %u\n", text, min, p->masklen); "masklen %u\n", text, min, p.masklen);
return 0; return 0;
} }