ctf-reader: Fix memory leak reported by valgrind

Message ID 20211122185540.1973401-1-guillermo.e.martinez@oracle.com
State New
Headers
Series ctf-reader: Fix memory leak reported by valgrind |

Commit Message

Guillermo E. Martinez Nov. 22, 2021, 6:55 p.m. UTC
  Hello,

Running unit test with check-valgrind, CTF reader test fails.

I'll appreciate your comments .. :-)

Thanks in advanced!
Guillermo

runtestreadctf fails executed by make check-valgrind, a memory leak is
reported:

  at 0x48397B5: malloc (vg_replace_malloc.c:381)
  by 0x56E6316: ctf_bufopen_internal (ctf-open.c:1388)
  by 0x56E5FD3: ctf_bufopen (ctf-open.c:1297)
  by 0x56CD688: ctf_arc_bufopen (ctf-archive.c:444)
  by 0x4EB31FD: abigail::ctf_reader::read_corpus(abigail::ctf_reader::read_context*,\
                 abigail::elf_reader::status&) (abg-ctf-reader.cc:1111)
  by 0x10C6BB: test_task_ctf::perform() (test-read-ctf.cc:236)
  by 0x4E8E9AF: abigail::workers::worker::wait_to_execute_a_task\
                  (abigail::workers::queue::priv*) (abg-workers.cc:400)
  by 0x543BEAD: start_thread (pthread_create.c:463)
  by 0x5369A5E: clone (clone.S:95)

This is happening because `ctf_variable_next' bumps the dictionary
reference counter, so when `ctf_close' is called it doesn't free the
memory allocated by the dict, because `ctf_refcnt' is greater than one.
Therefore `ctf_dict_close' is required.

	* src/abg-ctf-reader.cc (process_ctf_archive): Add
	ctf_dict_close

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 src/abg-ctf-reader.cc | 2 ++
 1 file changed, 2 insertions(+)
  

Comments

Jose E. Marchesi Nov. 22, 2021, 8:11 p.m. UTC | #1
> Hello,
>
> Running unit test with check-valgrind, CTF reader test fails.
>
> I'll appreciate your comments .. :-)
>
> Thanks in advanced!
> Guillermo

LGTM.

>
> runtestreadctf fails executed by make check-valgrind, a memory leak is
> reported:
>
>   at 0x48397B5: malloc (vg_replace_malloc.c:381)
>   by 0x56E6316: ctf_bufopen_internal (ctf-open.c:1388)
>   by 0x56E5FD3: ctf_bufopen (ctf-open.c:1297)
>   by 0x56CD688: ctf_arc_bufopen (ctf-archive.c:444)
>   by 0x4EB31FD: abigail::ctf_reader::read_corpus(abigail::ctf_reader::read_context*,\
>                  abigail::elf_reader::status&) (abg-ctf-reader.cc:1111)
>   by 0x10C6BB: test_task_ctf::perform() (test-read-ctf.cc:236)
>   by 0x4E8E9AF: abigail::workers::worker::wait_to_execute_a_task\
>                   (abigail::workers::queue::priv*) (abg-workers.cc:400)
>   by 0x543BEAD: start_thread (pthread_create.c:463)
>   by 0x5369A5E: clone (clone.S:95)
>
> This is happening because `ctf_variable_next' bumps the dictionary
> reference counter, so when `ctf_close' is called it doesn't free the
> memory allocated by the dict, because `ctf_refcnt' is greater than one.
> Therefore `ctf_dict_close' is required.
>
> 	* src/abg-ctf-reader.cc (process_ctf_archive): Add
> 	ctf_dict_close
>
> Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
> ---
>  src/abg-ctf-reader.cc | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
> index 3e17e049..b31a1b1f 100644
> --- a/src/abg-ctf-reader.cc
> +++ b/src/abg-ctf-reader.cc
> @@ -941,6 +941,8 @@ process_ctf_archive(read_context *ctxt, corpus_sptr corp)
>        }
>        if (ctf_errno(ctf_dict) != ECTF_NEXT_END)
>          fprintf(stderr, "ERROR from ctf_symbol_next\n");
> +
> +      ctf_dict_close(ctf_dict);
>      }
>    if (ctf_err != ECTF_NEXT_END)
>      fprintf(stderr, "ERROR from ctf_archive_next\n");
  
Dodji Seketeli Nov. 29, 2021, 7:48 a.m. UTC | #2
Hello,

"Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a écrit:

[...]

>
> 	* src/abg-ctf-reader.cc (process_ctf_archive): Add
> 	ctf_dict_close
>
> Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>

[...]

"Jose E. Marchesi via Libabigail" <libabigail@sourceware.org> a écrit:

[...]

> LGTM.

Applied to master, thanks!

[...]

Cheers,
  

Patch

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index 3e17e049..b31a1b1f 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -941,6 +941,8 @@  process_ctf_archive(read_context *ctxt, corpus_sptr corp)
       }
       if (ctf_errno(ctf_dict) != ECTF_NEXT_END)
         fprintf(stderr, "ERROR from ctf_symbol_next\n");
+
+      ctf_dict_close(ctf_dict);
     }
   if (ctf_err != ECTF_NEXT_END)
     fprintf(stderr, "ERROR from ctf_archive_next\n");