getpwnam_r 内存泄漏
我使用 getpwnam_r 来处理程序中的客户端连接。可悲的是,它似乎分配了一个永远不会释放的缓冲区。 相关的 valgrind 输出:
==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: getpwnam_r@@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.
有没有办法告诉 getpwnam_r 释放它的缓冲区?或者我必须抑制这些 Valgrind 错误?
谢谢,卡斯帕
I use getpwnam_r to handle client connections in my programs. Sadly enough, it seems to allocate a buffer it never frees.
The relevant valgrind output:
==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: getpwnam_r@@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 there a way to tell getpwnam_r to release it's buffers? Or will I have to suppress these Valgrind errors?
Thanks, Kasper
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
内存并不是专门为 getpwnam 分配的。相反,它代表
/etc/nsswitch.conf
的配置。 AFAICT,让 libc 释放此内存的唯一方法是通过调用 __libc_freeres:这应该释放 C 库占用的所有内存(而不仅仅是 NSS 占用的内存)。
The memory isn't really allocated for getpwnam specifically. Instead, it represents the configuration of
/etc/nsswitch.conf
. AFAICT, the only way to have libc release this memory is through calling__libc_freeres
:This is supposed to release all memory that the C library holds onto (not just the memory NSS holds onto).