[Bug 883775] [NEW] non cumulative memory leak in dlopen/dlclose
Ivan Sorokin
883775 at bugs.launchpad.net
Sun Oct 30 09:57:57 UTC 2011
Public bug reported:
Ubuntu 11.10, libc6 2.13-20ubuntu5.
After calling dlopen/dlclose few blocks of memory left unfreed. They
number is not grow when dlopen/dlclose are called several times.
This is not fatal bug, but it makes it harder to find memory leaks in
other parts of program.
Source code:
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
void print_dlerror()
{
char const* msg = dlerror();
if (msg == NULL)
fprintf(stderr, "unknown error at dynamic linking");
else
fprintf(stderr, "dynamic linking error: %s", msg);
}
int main()
{
void* asound = dlopen("/usr/lib/x86_64-linux-gnu/libasound.so.2", RTLD_LAZY);
if (asound == NULL)
{
print_dlerror();
return EXIT_FAILURE;
}
printf("module is loaded successfully: %p\n", asound);
dlclose(asound);
return EXIT_SUCCESS;
}
Valgrind output:
valgrind --leak-check=full --show-reachable=yes -v ./a.out
==2114== HEAP SUMMARY:
==2114== in use at exit: 3,361 bytes in 12 blocks
==2114== total heap usage: 22 allocs, 10 frees, 6,638 bytes allocated
==2114==
==2114== Searching for pointers to 12 not-freed blocks
==2114== Checked 114,056 bytes
==2114==
==2114== 64 bytes in 2 blocks are still reachable in loss record 1 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x40141B6: _dl_close_worker (dl-close.c:374)
==2114== by 0x401469D: _dl_close (dl-close.c:754)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E3000E: dlclose (dlclose.c:48)
==2114== by 0x4007AA: main (in /home/ivan/a.out)
==2114==
==2114== 71 bytes in 2 blocks are still reachable in loss record 2 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x40085B3: _dl_map_object (dl-load.c:162)
==2114== by 0x400C8A1: openaux (dl-deps.c:65)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x400CF65: _dl_map_object_deps (dl-deps.c:247)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E2FFC0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
==2114==
==2114== 71 bytes in 2 blocks are still reachable in loss record 3 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x400B42C: _dl_new_object (dl-object.c:161)
==2114== by 0x40065B5: _dl_map_object_from_fd (dl-load.c:957)
==2114== by 0x400831C: _dl_map_object (dl-load.c:2250)
==2114== by 0x400C8A1: openaux (dl-deps.c:65)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x400CF65: _dl_map_object_deps (dl-deps.c:247)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114==
==2114== 112 bytes in 2 blocks are still reachable in loss record 4 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x400D016: _dl_map_object_deps (dl-deps.c:470)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E2FFC0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
==2114== by 0x400771: main (in /home/ivan/a.out)
==2114==
==2114== 696 bytes in 2 blocks are still reachable in loss record 5 of 6
==2114== at 0x4C279F2: calloc (vg_replace_malloc.c:467)
==2114== by 0x4010329: _dl_check_map_versions (dl-version.c:300)
==2114== by 0x4012EC0: dl_open_worker (dl-open.c:269)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E2FFC0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
==2114== by 0x400771: main (in /home/ivan/a.out)
==2114==
==2114== 2,347 bytes in 2 blocks are still reachable in loss record 6 of 6
==2114== at 0x4C279F2: calloc (vg_replace_malloc.c:467)
==2114== by 0x400B1BD: _dl_new_object (dl-object.c:77)
==2114== by 0x40065B5: _dl_map_object_from_fd (dl-load.c:957)
==2114== by 0x400831C: _dl_map_object (dl-load.c:2250)
==2114== by 0x400C8A1: openaux (dl-deps.c:65)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x400CF65: _dl_map_object_deps (dl-deps.c:247)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114==
==2114== LEAK SUMMARY:
==2114== definitely lost: 0 bytes in 0 blocks
==2114== indirectly lost: 0 bytes in 0 blocks
==2114== possibly lost: 0 bytes in 0 blocks
==2114== still reachable: 3,361 bytes in 12 blocks
==2114== suppressed: 0 bytes in 0 blocks
** Affects: eglibc (Ubuntu)
Importance: Undecided
Status: New
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to eglibc in Ubuntu.
https://bugs.launchpad.net/bugs/883775
Title:
non cumulative memory leak in dlopen/dlclose
Status in “eglibc” package in Ubuntu:
New
Bug description:
Ubuntu 11.10, libc6 2.13-20ubuntu5.
After calling dlopen/dlclose few blocks of memory left unfreed. They
number is not grow when dlopen/dlclose are called several times.
This is not fatal bug, but it makes it harder to find memory leaks in
other parts of program.
Source code:
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
void print_dlerror()
{
char const* msg = dlerror();
if (msg == NULL)
fprintf(stderr, "unknown error at dynamic linking");
else
fprintf(stderr, "dynamic linking error: %s", msg);
}
int main()
{
void* asound = dlopen("/usr/lib/x86_64-linux-gnu/libasound.so.2", RTLD_LAZY);
if (asound == NULL)
{
print_dlerror();
return EXIT_FAILURE;
}
printf("module is loaded successfully: %p\n", asound);
dlclose(asound);
return EXIT_SUCCESS;
}
Valgrind output:
valgrind --leak-check=full --show-reachable=yes -v ./a.out
==2114== HEAP SUMMARY:
==2114== in use at exit: 3,361 bytes in 12 blocks
==2114== total heap usage: 22 allocs, 10 frees, 6,638 bytes allocated
==2114==
==2114== Searching for pointers to 12 not-freed blocks
==2114== Checked 114,056 bytes
==2114==
==2114== 64 bytes in 2 blocks are still reachable in loss record 1 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x40141B6: _dl_close_worker (dl-close.c:374)
==2114== by 0x401469D: _dl_close (dl-close.c:754)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E3000E: dlclose (dlclose.c:48)
==2114== by 0x4007AA: main (in /home/ivan/a.out)
==2114==
==2114== 71 bytes in 2 blocks are still reachable in loss record 2 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x40085B3: _dl_map_object (dl-load.c:162)
==2114== by 0x400C8A1: openaux (dl-deps.c:65)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x400CF65: _dl_map_object_deps (dl-deps.c:247)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E2FFC0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
==2114==
==2114== 71 bytes in 2 blocks are still reachable in loss record 3 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x400B42C: _dl_new_object (dl-object.c:161)
==2114== by 0x40065B5: _dl_map_object_from_fd (dl-load.c:957)
==2114== by 0x400831C: _dl_map_object (dl-load.c:2250)
==2114== by 0x400C8A1: openaux (dl-deps.c:65)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x400CF65: _dl_map_object_deps (dl-deps.c:247)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114==
==2114== 112 bytes in 2 blocks are still reachable in loss record 4 of 6
==2114== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==2114== by 0x400D016: _dl_map_object_deps (dl-deps.c:470)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E2FFC0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
==2114== by 0x400771: main (in /home/ivan/a.out)
==2114==
==2114== 696 bytes in 2 blocks are still reachable in loss record 5 of 6
==2114== at 0x4C279F2: calloc (vg_replace_malloc.c:467)
==2114== by 0x4010329: _dl_check_map_versions (dl-version.c:300)
==2114== by 0x4012EC0: dl_open_worker (dl-open.c:269)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4E3052E: _dlerror_run (dlerror.c:164)
==2114== by 0x4E2FFC0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
==2114== by 0x400771: main (in /home/ivan/a.out)
==2114==
==2114== 2,347 bytes in 2 blocks are still reachable in loss record 6 of 6
==2114== at 0x4C279F2: calloc (vg_replace_malloc.c:467)
==2114== by 0x400B1BD: _dl_new_object (dl-object.c:77)
==2114== by 0x40065B5: _dl_map_object_from_fd (dl-load.c:957)
==2114== by 0x400831C: _dl_map_object (dl-load.c:2250)
==2114== by 0x400C8A1: openaux (dl-deps.c:65)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x400CF65: _dl_map_object_deps (dl-deps.c:247)
==2114== by 0x4012BA6: dl_open_worker (dl-open.c:263)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114== by 0x4013379: _dl_open (dl-open.c:569)
==2114== by 0x4E2FF25: dlopen_doit (dlopen.c:67)
==2114== by 0x400E995: _dl_catch_error (dl-error.c:178)
==2114==
==2114== LEAK SUMMARY:
==2114== definitely lost: 0 bytes in 0 blocks
==2114== indirectly lost: 0 bytes in 0 blocks
==2114== possibly lost: 0 bytes in 0 blocks
==2114== still reachable: 3,361 bytes in 12 blocks
==2114== suppressed: 0 bytes in 0 blocks
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/883775/+subscriptions
More information about the foundations-bugs
mailing list