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]); binfo("Freeing alloc[%d]: %p\n", i, binp->alloc[i]);
#if defined(CONFIG_ARCH_USE_TEXT_HEAP) #if defined(CONFIG_ARCH_USE_TEXT_HEAP)
if (i == 0)
{
up_textheap_free((FAR void *)binp->alloc[i]); up_textheap_free((FAR void *)binp->alloc[i]);
#else }
kumm_free((FAR void *)binp->alloc[i]); else
#endif #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); up_addrenv_clone(&loadinfo.addrenv, &binp->addrenv);
#else #else
binp->alloc[0] = (FAR void *)loadinfo.textalloc; binp->alloc[0] = (FAR void *)loadinfo.textalloc;
binp->alloc[1] = (FAR void *)loadinfo.dataalloc;
#ifdef CONFIG_BINFMT_CONSTRUCTORS #ifdef CONFIG_BINFMT_CONSTRUCTORS
binp->alloc[1] = loadinfo.ctoralloc; binp->alloc[2] = loadinfo.ctoralloc;
binp->alloc[2] = loadinfo.dtoralloc; binp->alloc[3] = loadinfo.dtoralloc;
#endif #endif
#endif #endif

View File

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