about summary refs log tree commit
path: root/ext/rpatricia/rpatricia.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/rpatricia/rpatricia.c')
-rw-r--r--ext/rpatricia/rpatricia.c20
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);