Browse Source

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>
main
David Gibson 11 years ago
parent
commit
a7ecdb4e75
  1. 13
      tests/sw_tree1.c
  2. 18
      tests/sw_tree1.supp

13
tests/sw_tree1.c

@ -37,7 +37,7 @@ static enum { @@ -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) @@ -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) @@ -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[]) @@ -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[]) @@ -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

@ -0,0 +1,18 @@ @@ -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…
Cancel
Save