[U-Boot] [PATCH] malloc: handle free() before gd is set

Hans de Goede hdegoede at redhat.com
Fri Mar 4 09:45:55 CET 2016


Hi,

On 04-03-16 09:19, Stephen Warren wrote:
> On at least Ubuntu Xenial, free() can be called before main(). In this
> case, U-Boot won't have set gd, so dereferencing it will crash. Check
> whether gd is set before using it.
>
> While at it, apply the same fix to other functions.
>
> Signed-off-by: Stephen Warren <swarren at wwwdotorg.org>
> ---
>   common/dlmalloc.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/common/dlmalloc.c b/common/dlmalloc.c
> index 5ea37dfb6e4c..7453e63d6bf4 100644
> --- a/common/dlmalloc.c
> +++ b/common/dlmalloc.c
> @@ -2453,7 +2453,7 @@ void fREe(mem) Void_t* mem;
>
>   #ifdef CONFIG_SYS_MALLOC_F_LEN
>   	/* free() is a no-op - all the memory will be freed on relocation */
> -	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
> +	if (gd && !(gd->flags & GD_FLG_FULL_MALLOC_INIT))
>   		return;
>   #endif
>

I believe you want:

+	if (!gd || !(gd->flags & GD_FLG_FULL_MALLOC_INIT))

Instead, so that you actually go into the return; path when there is no gd.

Regards,

Hans



> @@ -2609,7 +2609,7 @@ Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes;
>     if (oldmem == NULL) return mALLOc(bytes);
>
>   #ifdef CONFIG_SYS_MALLOC_F_LEN
> -	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
> +	if (gd && !(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
>   		/* This is harder to support and should not be needed */
>   		panic("pre-reloc realloc() is not supported");
>   	}
> @@ -2985,7 +2985,7 @@ Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size;
>     else
>     {
>   #ifdef CONFIG_SYS_MALLOC_F_LEN
> -	if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
> +	if (gd && !(gd->flags & GD_FLG_FULL_MALLOC_INIT)) {
>   		MALLOC_ZERO(mem, sz);
>   		return mem;
>   	}
>


More information about the U-Boot mailing list