On Nov 13, 2010, at 10:34 AM, Kumar Gala wrote:

> 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.


Here's an example test case that fails if execute right after:

        mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);

        {
                void *p1;
                u8 *p2;
                int i;

                printf("MALLOC TEST\n");
                p1 = malloc(135176);
                printf("P1 = %p\n", p1);
                memset(p1, 0xab, 135176);

                free(p1);
                p2 = calloc(4097, 1);
                printf("P2 = %p %p\n", p2, p2 + 4097);

                for (i = 0; i < 4097; i++) {
                        if (p2[i] != 0)
                                printf("miscompare at byte %d got %x\n", i, 
p2[i]);
                }

                free(p2);
                printf("END MALLOC TEST\n\n");
        }

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

Reply via email to