OMQ'ers
Prior to this patch prefix_tree asserted for me with this test program
#include <prefix_tree.hpp>
#include <iostream>
#include <stdio.h>
int main()
{
zmq::prefix_tree_t m;
for (int i = 0; i < 512; i++)
{
printf("%08x\n",i);
m.add((unsigned char*)&i,sizeof(int));
}
int count = 0;
for (int i = 0; i < 512; i++)
{
printf("%08x\n",i);
count += m.check((unsigned char*)&i,sizeof(int));
}
printf("%d\n",count);
}
this is because as it adds the 255th element at a node it attempts to
calculate the count member var which is an unsigned char via
count = (255 -0) + 1;
and pass the result to realloc. Unfortunately the result is zero and
realloc returns null;
the prefix_tree asserts.
I have fixed it by making the count an unsigned short.
The fix works for me and the program above returns 512 as expected and
valgrind doesnt gripe either, but there may be a better way.
I'm submitting it under the MIT/X11 license should it be deemed acceptable.
Jon
diff --git a/src/prefix_tree.cpp b/src/prefix_tree.cpp
index 51225d6..6d4f084 100644
--- a/src/prefix_tree.cpp
+++ b/src/prefix_tree.cpp
@@ -42,7 +42,7 @@ zmq::prefix_tree_t::~prefix_tree_t ()
if (count == 1)
delete next.node;
else if (count > 1) {
- for (unsigned char i = 0; i != count; ++i)
+ for (unsigned short i = 0; i != count; ++i)
if (next.table [i])
delete next.table [i];
free (next.table);
@@ -74,7 +74,7 @@ void zmq::prefix_tree_t::add (unsigned char *prefix_, size_t
size_)
next.table = (prefix_tree_t**)
malloc (sizeof (prefix_tree_t*) * count);
zmq_assert (next.table);
- for (unsigned char i = 0; i != count; ++i)
+ for (unsigned short i = 0; i != count; ++i)
next.table [i] = 0;
min = std::min (min, c);
next.table [oldc - min] = oldp;
@@ -82,25 +82,25 @@ void zmq::prefix_tree_t::add (unsigned char *prefix_,
size_t size_)
else if (min < c) {
// The new character is above the current character range.
- unsigned char old_count = count;
+ unsigned short old_count = count;
count = c - min + 1;
next.table = (prefix_tree_t**) realloc ((void*) next.table,
sizeof (prefix_tree_t*) * count);
zmq_assert (next.table);
- for (unsigned char i = old_count; i != count; i++)
+ for (unsigned short i = old_count; i != count; i++)
next.table [i] = NULL;
}
else {
// The new character is below the current character range.
- unsigned char old_count = count;
+ unsigned short old_count = count;
count = (min + old_count) - c;
next.table = (prefix_tree_t**) realloc ((void*) next.table,
sizeof (prefix_tree_t*) * count);
zmq_assert (next.table);
memmove (next.table + min - c, next.table,
old_count * sizeof (prefix_tree_t*));
- for (unsigned char i = 0; i != min - c; i++)
+ for (unsigned short i = 0; i != min - c; i++)
next.table [i] = NULL;
min = c;
}
diff --git a/src/prefix_tree.hpp b/src/prefix_tree.hpp
index 53c7c18..bf1c4b9 100644
--- a/src/prefix_tree.hpp
+++ b/src/prefix_tree.hpp
@@ -42,7 +42,7 @@ namespace zmq
uint32_t refcnt;
unsigned char min;
- unsigned char count;
+ unsigned short count;
union {
class prefix_tree_t *node;
class prefix_tree_t **table;
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev