代码之家  ›  专栏  ›  技术社区  ›  Kasper

getpwnam_r内存泄漏

  •  4
  • Kasper  · 技术社区  · 17 年前

    我使用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错误?

    谢谢,Kasper

    1 回复  |  直到 14 年前
        1
  •  7
  •   Martin v. Löwis    17 年前

    内存不是专门为getpwnam分配的。相反,它表示 /etc/nsswitch.conf . afaict,让libc释放这个内存的唯一方法是调用 __libc_freeres 以下内容:

    extern void __libc_freeres (void);
    

    这应该释放C库保存的所有内存(而不仅仅是NSS保存的内存)。