2009-09-18 8 views
4

J'utilise getpwnam_r pour gérer les connexions client dans mes programmes. Malheureusement, il semble allouer un tampon qu'il ne libère jamais. La sortie valgrind pertinente:getpwnam_r fuite de mémoire


==15774== 536 (104 direct, 432 indirect) bytes in 2 blocks are definitely lost in loss record 1 of 3 
==15774== at 0x4C24CFE: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so) 
==15774== by 0x5143B5A: nss_parse_service_list (in /lib64/libc-2.10.1.so) 
==15774== by 0x51442E6: __nss_database_lookup (in /lib64/libc-2.10.1.so) 
==15774== by 0x57BE35F: ??? 
==15774== by 0x57BF3F6: ??? 
==15774== by 0x51014D2: [email protected]@GLIBC_2.2.5 (in /lib64/libc-2.10.1.so) 
==15774== by 0x407906: dopass (auth.c:71) 
==15774== by 0x40393E: do_cmd (command.c:127) 
==15774== by 0x402496: ftp_main (server.c:58) 
==15774== by 0x40224C: handle_client (daemon.c:211) 
==15774== by 0x402073: daemon_main (daemon.c:123) 
==15774== by 0x4043CC: main (main.c:48) 
==15774== 
==15774== LEAK SUMMARY: 
==15774== definitely lost: 104 bytes in 2 blocks. 
==15774== indirectly lost: 432 bytes in 18 blocks. 
==15774==  possibly lost: 0 bytes in 0 blocks. 
==15774== still reachable: 0 bytes in 0 blocks. 
==15774==   suppressed: 0 bytes in 0 blocks. 

Ise-il un moyen de dire getpwnam_r pour le libérer des tampons est? Ou devrais-je supprimer ces erreurs Valgrind?

Merci, Kasper

+0

Je pense que ceci est un doublon, voir ici: http://stackoverflow.com/questions/188591/is-there-a-fix-or-a-workaround-for-the-memory-leak-in-getpwnam/266785 – schnaader

+0

@schnaader: Jetez un coup d'œil aux questions. Ce n'est pas un doublon car getpwnam souffre de la même fuite de mémoire que cette fonction. La question a juste fait référence aux données statiques getpwnam allouées que getpwnam_r ne fait pas. – kmm

Répondre

7

La mémoire est pas vraiment alloué pour getpwnam spécifiquement. Au lieu de cela, il représente la configuration de /etc/nsswitch.conf. AFAICT, la seule façon d'avoir communiqué libc cette mémoire est en appelant __libc_freeres:

extern void __libc_freeres (void); 

Ce système est censé libérer toute la mémoire que la bibliothèque C détient sur (et pas seulement la mémoire NSS détient sur).