mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
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:
17
tree234.c
17
tree234.c
@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user