Skip to content

Commit

Permalink
Fix prefix address range parsing
Browse files Browse the repository at this point in the history
This solves #65
  • Loading branch information
job committed Sep 7, 2022
1 parent ab683d7 commit 5507267
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 32 deletions.
4 changes: 2 additions & 2 deletions expander.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ bgpq_expander_add_prefix(struct bgpq_expander *b, char *prefix)
sx_radix_tree_insert(b->tree, p);

if (p)
sx_prefix_destroy(p);
sx_prefix_free(p);

return 1;
}
Expand Down Expand Up @@ -1113,7 +1113,7 @@ sx_radix_node_freeall(struct sx_radix_node *n) {
if (n->payload)
free(n->payload);

sx_prefix_destroy(n->prefix);
sx_prefix_free(n->prefix);

free(n);
}
Expand Down
49 changes: 19 additions & 30 deletions sx_prefix.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,28 +259,19 @@ sx_prefix_setbit(struct sx_prefix *p, int n)


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)
{
struct sx_prefix *np;
struct sx_radix_node *nn;
if (p.masklen >= min)
sx_radix_tree_insert(t, &p);

np = sx_prefix_alloc(p);

if (np->masklen >= min) {
nn = sx_radix_tree_insert(t, np);
sx_prefix_free(np);
np = nn->prefix;
}

if (np->masklen + 1 > max)
if (p.masklen + 1 > max)
return 1;


np->masklen += 1;
sx_radix_tree_insert_specifics(t, np, min, max);
sx_prefix_setbit(np, np->masklen);
sx_radix_tree_insert_specifics(t, np, min, max);
p.masklen += 1;
sx_radix_tree_insert_specifics(t, p, min, max);
sx_prefix_setbit(&p, p.masklen);
sx_radix_tree_insert_specifics(t, p, min, max);

return 1;
}
Expand All @@ -289,42 +280,40 @@ int
sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
char *text)
{
char *d = strchr(text, '^');
struct sx_prefix *p;
struct sx_prefix p;
unsigned long min, max = 0;

p = sx_prefix_alloc(NULL);
char *d = strchr(text, '^');

if (!d || !d[1])
return 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,
d + 1);
return 0;
}

*d = '^';

if (af && p->family != af) {
if (af && p.family != af) {
sx_report(SX_ERROR, "Ignoring prefix %s, wrong af %i\n", text,
p->family);
p.family);
return 0;
}

if (maxlen && p->masklen > maxlen) {
if (maxlen && p.masklen > maxlen) {
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;
}

if (d[1] == '-') {
min = p->masklen + 1;
min = p.masklen + 1;
max = maxlen;
} else if (d[1] == '+') {
min = p->masklen;
min = p.masklen;
max = maxlen;
} else if (isdigit(d[1])) {
char *dm = NULL;
Expand All @@ -341,9 +330,9 @@ sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
return 0;
}

if (min < p->masklen) {
if (min < p.masklen) {
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;
}

Expand Down

0 comments on commit 5507267

Please sign in to comment.