I've been debugging a "memory corruption" issue and it seems to come down to 
how we set MORECORE_CLEARS

from malloc.h:

  MORECORE                  (default: sbrk)
     The name of the routine to call to obtain more memory from the system.
  MORECORE_FAILURE          (default: -1)
     The value returned upon failure of MORECORE.
  MORECORE_CLEARS           (default 1)
     True (1) if the routine mapped to MORECORE zeroes out memory (which
     holds for sbrk).


So the issue I'm seeing is that we zero out memory in mem_malloc_init().  Thus 
our sbrk implementation just does simple record keeping.  However we can get 
into the following situation:

a1 = malloc(LARGE_SZ);  /* causes internals to call sbrk */
...
/* use memory at 'a1' */
...
free(a1);       /* causes internals to call malloc_trim, malloc_trim decides to 
return memory to sbrk, memory is now nonzero */

a2 = calloc(SIZE);      /* internals assume sbrk memory is zero because of 
MORECORE_CLEARS setting, however its not */

... BAD THINGS HAPPEN ...


I'm guessing we haven't seen much of this because there aren't that many users 
of calloc today.  I happen to see it related to NAND code which has kzalloc 
defined as calloc.

- k
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to