12

根据问题,我遇到了一些由getnameinfo泄漏的内存。我正在使用带有 gcc版本 4.6.3的 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) 。
我正在将我的服务器可执行文件与g++链接,到目前为止 valgrind 还没有报告问题。然后,我添加了一个对getnameinfo的简单调用,以打印出连接客户端的网络名称和端口。
我得到以下信息:

==4425==
==4425== 堆摘要:
==4425== 在退出时使用:1 个块中的 10 个字节
==4425== 总堆使用量:4,508 分配,4,507 释放,134,939,153 字节分配
==4425==
==4425== 1 个块中的 10 个字节肯定丢失在丢失记录 1 of 1
==4425== 在 0x4C2B6CD:malloc(在 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 中)
==4425== 由 0x50D7D71: strdup (strdup.c:43)
==4425== 由 0x1484B861: ???
==4425== 0x515B871:gethostbyaddr_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256)
==4425== 由 0x5161D06:getnameinfo (getnameinfo.c:223)
==4425== 由 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== 仍然可达:0 个块中的 0 个字节
==4425== 抑制:0 个块中的 0 个字节
==4425==
==4425== 对于检测到和抑制的错误计数,重新运行:-v
==4425== 错误摘要:来自 11 个上下文的 12 个错误(抑制:2 个来自 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 个字节泄漏(我猜客户端是从同一个主机连接的,所以如果它与主机名有关,增长是线性的正如预期的那样)。
任何的想法?

干杯

4

1 回答 1

3

终于找到了真正的漏洞。

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

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

干杯

于 2012-12-31T10:34:29.673 回答