是否确认getnameinfo内存泄漏

Is getnameinfo memory leaking confirmed?

本文关键字:泄漏 内存 getnameinfo 确认 是否      更新时间:2023-10-16

根据问题,我遇到了一些内存泄漏getnameinfo。我正在使用Ubuntu 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==堆汇总:==4425==在退出时使用:1块10字节==4425==总堆使用率:分配4,508个字节,释放4,507个字节,分配了134,939,153个字节4425 = = = ===4425== 1块中的10个字节肯定在1的丢失记录1中丢失==4425== at 0x4C2B6CD: malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)==4425== 0x50D7D71: strdup (strdup.c:43)==4425==由0x1484B861: ??==4425== by 0x515B871: gethostbyaddr_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256)==4425== 0x5161D06: getnameinfo (getnameinfo.c:223)==4425== by 0x404175: solsrv_run (solsrv.c:381)==4425== by 0x404DAC: main (main.c:167)4425 = = = ===4425==泄漏总结:==4425==绝对丢失:1块10字节==4425==间接丢失:0块中0字节==4425==可能丢失:0个块中的0个字节==4425== still reachable: 0字节,0块==4425== suppressed: 0个字节,0块4425 = = = ===4425==对于检测到和抑制的错误计数,使用-v重新运行==4425== ERROR SUMMARY: 11个上下文中的12个错误(抑制: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);
}

这就是泄漏…
我可以确认,泄漏是发生:对于连接的6个客户端,valgrind发现60字节泄漏(我猜客户端是从同一主机连接的,所以如果它与主机名有关,则增长如预期的那样呈线性)。任何想法?

欢呼

最终发现真正的泄漏

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

我可以在12.04, 12.10上重现x64x86上的错误。如果我在名称上指定.local连接,它会泄漏。

欢呼