Rather to my surprise given the amount of testing this code has had,

Kevin Lyles spotted a tree234 bug! copytree234() segfaulted when
asked to copy a tree containing no elements, due to failing to allow
for the case that t->root might be NULL. Fixed, and added a
regression test.

[originally from svn r7092]
This commit is contained in:
Simon Tatham
2007-01-11 09:26:09 +00:00
parent 7c59e7259f
commit c06e371f55

View File

@ -35,6 +35,9 @@
#ifdef TEST #ifdef TEST
#define LOG(x) (printf x) #define LOG(x) (printf x)
#define smalloc malloc
#define srealloc realloc
#define sfree free
#else #else
#define LOG(x) #define LOG(x)
#endif #endif
@ -1438,8 +1441,11 @@ tree234 *copytree234(tree234 *t, copyfn234 copyfn, void *copyfnstate) {
tree234 *t2; tree234 *t2;
t2 = newtree234(t->cmp); t2 = newtree234(t->cmp);
t2->root = copynode234(t->root, copyfn, copyfnstate); if (t->root) {
t2->root->parent = NULL; t2->root = copynode234(t->root, copyfn, copyfnstate);
t2->root->parent = NULL;
} else
t2->root = NULL;
return t2; return t2;
} }
@ -1885,8 +1891,6 @@ int mycmp(void *av, void *bv) {
return strcmp(a, b); return strcmp(a, b);
} }
#define lenof(x) ( sizeof((x)) / sizeof(*(x)) )
char *strings[] = { char *strings[] = {
"0", "2", "3", "I", "K", "d", "H", "J", "Q", "N", "n", "q", "j", "i", "0", "2", "3", "I", "K", "d", "H", "J", "Q", "N", "n", "q", "j", "i",
"7", "G", "F", "D", "b", "x", "g", "B", "e", "v", "V", "T", "f", "E", "7", "G", "F", "D", "b", "x", "g", "B", "e", "v", "V", "T", "f", "E",
@ -2120,11 +2124,12 @@ int main(void) {
tree = newtree234(mycmp); tree = newtree234(mycmp);
cmp = mycmp; cmp = mycmp;
arraylen = 0; arraylen = 0;
for (i = 0; i < 16; i++) { for (i = 0; i < 17; i++) {
addtest(strings[i]);
tree2 = copytree234(tree, NULL, NULL); tree2 = copytree234(tree, NULL, NULL);
splittest(tree2, array, arraylen); splittest(tree2, array, arraylen);
freetree234(tree2); freetree234(tree2);
if (i < 16)
addtest(strings[i]);
} }
freetree234(tree); freetree234(tree);