[U-Boot] [PATCH] dlmalloc: ensure gd is set for early free

Eugeniu Rosca erosca at de.adit-jv.com
Wed May 23 19:07:10 UTC 2018


This fix seems to be a twin of v2015.01 commit 854d2b9753e4 ("dlmalloc:
ensure gd is set for early alloc"). Here is a gdb backtrace to make them
look even more similar (sandbox build):

(gdb) run
Starting program: /path/to/u-boot
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00000000004123c0 in free (mem=0x0) at common/dlmalloc.c:2460
2460	  if (mem == NULL)                              /* free(0) has no effect */
(gdb) where
 #0  0x00000000004123c0 in free (mem=0x0) at common/dlmalloc.c:2460
 #1  0x00007ffff3f46cea in ?? () from /lib/x86_64-linux-gnu/libselinux.so.1
 #2  0x00007ffff7de76ba in call_init (l=<optimized out>, argc=argc at entry=1, argv=argv at entry=0x7fffffffd928, env=env at entry=0x7fffffffd938) at dl-init.c:72
 #3  0x00007ffff7de77cb in call_init (env=0x7fffffffd938, argv=0x7fffffffd928, argc=1, l=<optimized out>) at dl-init.c:30
 #4  _dl_init (main_map=0x7ffff7ffe168, argc=1, argv=0x7fffffffd928, env=0x7fffffffd938) at dl-init.c:120
 #5  0x00007ffff7dd7c6a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
 #6  0x0000000000000001 in ?? ()
 #7  0x00007fffffffddbb in ?? ()
 #8  0x0000000000000000 in ?? ()

Interestingly, this issue appears on a very old v2015.04 U-boot, but
not on u-boot/master (even if the fix applies cleanly to u-boot/master).
With the patch applied, my ancient u-boot starts to work properly:

$ ./u-boot

U-Boot 2015.04-00280-g5755c9e48b83 (May 23 2018 - 20:53:31)

DRAM:  128 MiB
Using default environment

In:    serial
Out:   lcd
Err:   lcd
=>

Signed-off-by: Eugeniu Rosca <erosca at de.adit-jv.com>
---
 common/dlmalloc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/common/dlmalloc.c b/common/dlmalloc.c
index b395eefbf862..6012f9f162c0 100644
--- a/common/dlmalloc.c
+++ b/common/dlmalloc.c
@@ -1524,7 +1524,7 @@ void fREe(mem) Void_t* mem;
 
 #if CONFIG_VAL(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
 
-- 
2.17.0



More information about the U-Boot mailing list