Fix valgrind errors in sw_tree1
The sw_tree1 testcase has accumulated some valgrind errors, at least in the "realloc" mode. * It had both a realloc_fdt() and explicit xmalloc() for the initial allocation which was redundant and caused errors. * It doesn't make sense to call fdt_resize() until after we've created the initial stub tree * Alignment gaps inserted into the tree contain uninitialized data, which trips an error when we write it out. We could zero the buffer, but that would make it easier to miss real bugs, so we add suppressions for the valgrind warnings instead. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
edb10bcf1c
commit
a7ecdb4e75
2 changed files with 26 additions and 5 deletions
|
@ -37,7 +37,7 @@ static enum {
|
|||
REALLOC,
|
||||
} alloc_mode;
|
||||
|
||||
static void realloc_fdt(void **fdt, size_t *size)
|
||||
static void realloc_fdt(void **fdt, size_t *size, bool created)
|
||||
{
|
||||
switch (alloc_mode) {
|
||||
case FIXED:
|
||||
|
@ -61,7 +61,8 @@ static void realloc_fdt(void **fdt, size_t *size)
|
|||
case REALLOC:
|
||||
*size += 1;
|
||||
*fdt = xrealloc(*fdt, *size);
|
||||
fdt_resize(*fdt, *fdt, *size);
|
||||
if (created)
|
||||
fdt_resize(*fdt, *fdt, *size);
|
||||
return;
|
||||
|
||||
default:
|
||||
|
@ -73,7 +74,7 @@ static void realloc_fdt(void **fdt, size_t *size)
|
|||
do { \
|
||||
err = (code); \
|
||||
if (err == -FDT_ERR_NOSPACE) \
|
||||
realloc_fdt(&fdt, &size); \
|
||||
realloc_fdt(&fdt, &size, created); \
|
||||
else if (err) \
|
||||
FAIL(#code ": %s", fdt_strerror(err)); \
|
||||
} while (err != 0)
|
||||
|
@ -83,6 +84,7 @@ int main(int argc, char *argv[])
|
|||
void *fdt = NULL;
|
||||
size_t size;
|
||||
int err;
|
||||
bool created = false;
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
|
@ -108,12 +110,13 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
}
|
||||
|
||||
realloc_fdt(&fdt, &size);
|
||||
|
||||
fdt = xmalloc(size);
|
||||
CHECK(fdt_create(fdt, size));
|
||||
|
||||
created = true;
|
||||
|
||||
CHECK(fdt_add_reservemap_entry(fdt, TEST_ADDR_1, TEST_SIZE_1));
|
||||
|
||||
CHECK(fdt_add_reservemap_entry(fdt, TEST_ADDR_2, TEST_SIZE_2));
|
||||
CHECK(fdt_finish_reservemap(fdt));
|
||||
|
||||
|
|
18
tests/sw_tree1.supp
Normal file
18
tests/sw_tree1.supp
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
allocation methods causes uninitialized data in alignment gap
|
||||
Memcheck:Param
|
||||
write(buf)
|
||||
fun:__write_nocancel
|
||||
fun:utilfdt_write_err
|
||||
fun:save_blob
|
||||
fun:main
|
||||
}
|
||||
{
|
||||
allocation methods causes uninitialized data in alignment gap
|
||||
Memcheck:Param
|
||||
write(buf)
|
||||
fun:__write_nocancel
|
||||
fun:utilfdt_write_err
|
||||
fun:save_blob
|
||||
fun:main
|
||||
}
|
Loading…
Reference in a new issue