mirror of
https://github.com/zeromq/libzmq.git
synced 2024-12-13 18:55:10 +01:00
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:
parent
8ec0743c75
commit
14853c2db5
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user