Подтверждено ли утечка памяти getnameinfo?
В соответствии с вопросом, я запускаю утечку памяти через getnameinfo. Я использую Ubuntu 12.04 (Linux scv 3.2.0-35-generiС# 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: [email protected]@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);
}
И там у вас есть утечка...
Я могу подтвердить, что утечка происходит: для 6 клиентов, связанных с valgrind, обнаружено 60 байтов (я думаю, что клиенты подключались от одного и того же хоста, поэтому, если это связано с именем хоста, рост является линейным, как ожидалось).
Любая идея?
Приветствия
Ответы
Ответ 1
В конце концов обнаружена настоящая утечка.
При подключении к сокету сервера используйте name.local
вместо localhost
и/или полное имя.
getnameinfo()
будет течь.
Я могу воспроизвести ошибку на 12.04
, 12.10
как x64, так и x86.
Если я подключу указание .local
на имя, которое оно протекает.
Приветствия