binfmt: Fix memory leak in ELF loader

Summary:
- I noticed that the hello (ELF) application causes a memory leak.
- Finally, I found that the data section is not deallocated.
- This commit fixes this issue.

Impact:
- ELF loader with CONFIG_ARCH_ADDRENV=n

Testing:
- Tested with the following configs
  - sprensense:elf, esp32-devkitc:elf, sabre-6quad:elf
  - spresense:wifi_smp, rv-virt:nsh64, sabre-6quad:netnsh

Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
Masayuki Ishikawa 2022-07-22 23:10:47 +09:00 committed by Xiang Xiao
parent 79952163c1
commit 0cef7b765e
3 changed files with 12 additions and 6 deletions

View File

@ -167,10 +167,15 @@ int unload_module(FAR struct binary_s *binp)
{
binfo("Freeing alloc[%d]: %p\n", i, binp->alloc[i]);
#if defined(CONFIG_ARCH_USE_TEXT_HEAP)
up_textheap_free((FAR void *)binp->alloc[i]);
#else
kumm_free((FAR void *)binp->alloc[i]);
if (i == 0)
{
up_textheap_free((FAR void *)binp->alloc[i]);
}
else
#endif
{
kumm_free((FAR void *)binp->alloc[i]);
}
}
}

View File

@ -277,9 +277,10 @@ static int elf_loadbinary(FAR struct binary_s *binp,
up_addrenv_clone(&loadinfo.addrenv, &binp->addrenv);
#else
binp->alloc[0] = (FAR void *)loadinfo.textalloc;
binp->alloc[1] = (FAR void *)loadinfo.dataalloc;
#ifdef CONFIG_BINFMT_CONSTRUCTORS
binp->alloc[1] = loadinfo.ctoralloc;
binp->alloc[2] = loadinfo.dtoralloc;
binp->alloc[2] = loadinfo.ctoralloc;
binp->alloc[3] = loadinfo.dtoralloc;
#endif
#endif

View File

@ -39,7 +39,7 @@
* Pre-processor Definitions
****************************************************************************/
#define BINFMT_NALLOC 3
#define BINFMT_NALLOC 4
/****************************************************************************
* Public Types