Prior to this patch prefix_tree asserts.

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.
This commit is contained in:
Jon Dyte 2010-09-02 07:52:02 +02:00 committed by Martin Sustrik
parent 8ec0743c75
commit 14853c2db5
2 changed files with 7 additions and 7 deletions

View File

@ -42,7 +42,7 @@ zmq::prefix_tree_t::~prefix_tree_t ()
if (count == 1) if (count == 1)
delete next.node; delete next.node;
else if (count > 1) { else if (count > 1) {
for (unsigned char i = 0; i != count; ++i) for (unsigned short i = 0; i != count; ++i)
if (next.table [i]) if (next.table [i])
delete next.table [i]; delete next.table [i];
free (next.table); free (next.table);
@ -74,7 +74,7 @@ void zmq::prefix_tree_t::add (unsigned char *prefix_, size_t size_)
next.table = (prefix_tree_t**) next.table = (prefix_tree_t**)
malloc (sizeof (prefix_tree_t*) * count); malloc (sizeof (prefix_tree_t*) * count);
zmq_assert (next.table); zmq_assert (next.table);
for (unsigned char i = 0; i != count; ++i) for (unsigned short i = 0; i != count; ++i)
next.table [i] = 0; next.table [i] = 0;
min = std::min (min, c); min = std::min (min, c);
next.table [oldc - min] = oldp; 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) { else if (min < c) {
// The new character is above the current character range. // The new character is above the current character range.
unsigned char old_count = count; unsigned short old_count = count;
count = c - min + 1; count = c - min + 1;
next.table = (prefix_tree_t**) realloc ((void*) next.table, next.table = (prefix_tree_t**) realloc ((void*) next.table,
sizeof (prefix_tree_t*) * count); sizeof (prefix_tree_t*) * count);
zmq_assert (next.table); 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; next.table [i] = NULL;
} }
else { else {
// The new character is below the current character range. // The new character is below the current character range.
unsigned char old_count = count; unsigned short old_count = count;
count = (min + old_count) - c; count = (min + old_count) - c;
next.table = (prefix_tree_t**) realloc ((void*) next.table, next.table = (prefix_tree_t**) realloc ((void*) next.table,
sizeof (prefix_tree_t*) * count); sizeof (prefix_tree_t*) * count);
zmq_assert (next.table); zmq_assert (next.table);
memmove (next.table + min - c, next.table, memmove (next.table + min - c, next.table,
old_count * sizeof (prefix_tree_t*)); 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; next.table [i] = NULL;
min = c; min = c;
} }

View File

@ -42,7 +42,7 @@ namespace zmq
uint32_t refcnt; uint32_t refcnt;
unsigned char min; unsigned char min;
unsigned char count; unsigned short count;
union { union {
class prefix_tree_t *node; class prefix_tree_t *node;
class prefix_tree_t **table; class prefix_tree_t **table;