2012-12-24 16 views
12

Jak na pytanie, uruchamiam niektóre wycieki pamięci przez getnameinfo. Używam Ubuntu 12.04 (Linux scv 3.2.0-35-generiC# 55-Ubuntu SMP śr. Kwiecień 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux) z gcc wersja 4.6.3.
Łączę mój plik wykonywalny serwera z g ++ i jak dotąd valgrind nie zgłosił problemu. Dodałem następnie prosty telefon pod numer getnameinfo, aby wydrukować nazwę sieci i port łączenia klientów.
I uzyskać następujące:Czy otrzymujesz komunikat o błędzie 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) 

Co robię źle?
Code jest po prostu w następujący sposób:

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); 
} 

I nie masz przeciek ...
Mogę potwierdzić, że wyciek jest dzieje: dla 6 klientów podłączonych valgrind Znaleziono 60 bajtów wyciekły (Domyślam się, że klienci łączyli się z tego samego hosta, więc jeśli jest on powiązany z nazwą hosta, wzrost jest liniowy zgodnie z oczekiwaniami).
Każdy pomysł?

Cheers

+0

Zawsze można pobrać źródło i sprawdzić, co robi. –

+0

A ponieważ jest to open source, sam możesz rozwiązać problem! –

+0

Może to zrobić :-) – Emanuele

Odpowiedz

3

Ostatecznie znalazł prawdziwe wyciek.

Podczas podłączania do gniazda serwera należy użyć name.local zamiast localhost i/lub pełnej nazwy.
getnameinfo() będzie przeciekać.

mogę odtworzyć błąd na 12.04, 12.10 zarówno i x86.
Po połączeniu podając nazwę .local na nazwę, którą wycieknie.

Pozdrawiam

Powiązane problemy