diff options
Diffstat (limited to 'ext/rpatricia/rpatricia.c')
-rw-r--r-- | ext/rpatricia/rpatricia.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/ext/rpatricia/rpatricia.c b/ext/rpatricia/rpatricia.c index f8ce0b5..4132c32 100644 --- a/ext/rpatricia/rpatricia.c +++ b/ext/rpatricia/rpatricia.c @@ -44,7 +44,7 @@ wrap_node(patricia_node_t *orig) } static prefix_t * -my_ascii2prefix(VALUE str) +my_ascii2prefix(patricia_tree_t *tree, VALUE str) { char *cstr = StringValuePtr(str); prefix_t *prefix = ascii2prefix(cstr); @@ -52,6 +52,14 @@ my_ascii2prefix(VALUE str) if (!prefix) rb_raise(rb_eArgError, "invalid prefix: %s", cstr); + if (prefix->bitlen > tree->maxbits) { + unsigned bitlen = prefix->bitlen; + + Deref_Prefix(prefix); + rb_raise(rb_eArgError, "prefix length (%u) larger than maxbits (%u)", + bitlen, tree->maxbits); + } + return prefix; } @@ -67,7 +75,7 @@ p_add (int argc, VALUE *argv, VALUE self) return Qnil; Data_Get_Struct(self, patricia_tree_t, tree); - prefix = my_ascii2prefix(argv[0]); + prefix = my_ascii2prefix(tree, argv[0]); node = patricia_lookup(tree, prefix); Deref_Prefix(prefix); @@ -94,7 +102,7 @@ p_remove (VALUE self, VALUE r_key) prefix_t *prefix; Data_Get_Struct(self, patricia_tree_t, tree); - prefix = my_ascii2prefix(r_key); + prefix = my_ascii2prefix(tree, r_key); node = patricia_search_exact(tree, prefix); Deref_Prefix (prefix); @@ -114,7 +122,7 @@ p_match (VALUE self, VALUE r_key) prefix_t *prefix; Data_Get_Struct(self, patricia_tree_t, tree); - prefix = my_ascii2prefix(r_key); + prefix = my_ascii2prefix(tree, r_key); node = patricia_search_best(tree, prefix); Deref_Prefix (prefix); @@ -129,7 +137,7 @@ p_include (VALUE self, VALUE r_key) prefix_t *prefix; Data_Get_Struct(self, patricia_tree_t, tree); - prefix = my_ascii2prefix(r_key); + prefix = my_ascii2prefix(tree, r_key); node = patricia_search_best(tree, prefix); Deref_Prefix (prefix); @@ -144,7 +152,7 @@ p_match_exact (VALUE self, VALUE r_key) prefix_t *prefix; Data_Get_Struct(self, patricia_tree_t, tree); - prefix = my_ascii2prefix(r_key); + prefix = my_ascii2prefix(tree, r_key); node = patricia_search_exact(tree, prefix); Deref_Prefix (prefix); |