是否确认了getnameinfo内存泄漏?

时间:2012-12-24 20:53:18

标签: c++ c memory-leaks network-programming

根据问题,我遇到了 getnameinfo 泄漏的内存。我正在使用Uccntu 12.04(Linux scv 3.2.0-35-generic#55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux)和gcc 版本4.6.3
我将我的服务器可执行文件与 g ++ 相关联,到目前为止valgrind尚未报告问题。然后我添加了一个简单的调用 getnameinfo 来打印出连接客户端的网络名称和端口。
我得到以下内容:

==4425== 
==4425== HEAP SUMMARY:
==4425==     in use at exit: 10 bytes in 1 blocks
==4425==   total heap usage: 4,508 allocs, 4,507 frees, 134,939,153 bytes allocated
==4425== 
==4425== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4425==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4425==    by 0x50D7D71: strdup (strdup.c:43)
==4425==    by 0x1484B861: ???
==4425==    by 0x515B871: gethostbyaddr_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256)
==4425==    by 0x5161D06: getnameinfo (getnameinfo.c:223)
==4425==    by 0x404175: solsrv_run (solsrv.c:381)
==4425==    by 0x404DAC: main (main.c:167)
==4425== 
==4425== LEAK SUMMARY:
==4425==    definitely lost: 10 bytes in 1 blocks
==4425==    indirectly lost: 0 bytes in 0 blocks
==4425==      possibly lost: 0 bytes in 0 blocks
==4425==    still reachable: 0 bytes in 0 blocks
==4425==         suppressed: 0 bytes in 0 blocks
==4425== 
==4425== For counts of detected and suppressed errors, rerun with: -v
==4425== ERROR SUMMARY: 12 errors from 11 contexts (suppressed: 2 from 2)

我做错了什么? 代码简单如下:

struct sockaddr addr;
socklen_t           addr_sz = sizeof(addr);
char        host[NI_MAXHOST],
            serv[NI_MAXSERV];
int infd = accept(srv_fd, (struct sockaddr*)&addr, &addr_sz);
if (infd == -1) {
    ... manage error on accept ...
}
if(getnameinfo((struct sockaddr *)&addr, addr_sz, host, NI_MAXHOST, serv, NI_MAXSERV, NI_NUMERICSERV)) {
    strncpy(host, "<unknown host>", NI_MAXHOST-1);
    strncpy(serv, "<unknown port>", NI_MAXSERV-1);
}

你有泄漏......
我可以确认,泄漏正在发生:对于连接 valgrind 的6个客户端发现60个字节泄露(我猜客户端是从同一主机连接的,所以如果它与主机相关名称增长是预期的线性) 有什么想法吗?

干杯

1 个答案:

答案 0 :(得分:3)

最终发现了真正的泄密。

连接到服务器套接字时,请使用name.local代替localhost和/或完全限定名称。
然后getnameinfo()会泄漏。

我可以在12.0412.10上重现 x64 x86 的错误。
如果我在名称泄漏时指定.local连接。

干杯