2012-12-24 8 views
12

Wie pro Frage, ich renne in etwas Speicher undicht von getnameinfo. Ich benutze Ubuntu 12.04 (Linux scv 3.2.0-35-generiC# 55-Ubuntu SMP Wed Dez 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux) mit gcc Version 4.6.3.
Ich verbinde meine ausführbare Serverdatei mit g ++ und Valgrind hat bis jetzt kein Problem gemeldet. Ich habe dann einen einfachen Anruf an getnameinfo hinzugefügt, um auszudrucken, was der Netzwerkname und Port von Verbindungsclients sind.
Und ich folgendes:Ist Getnameinfo Speicherleck bestätigt?

 
==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) 

Was mache ich falsch?
-Code ist einfach wie folgt:

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

Und dort haben Sie das Leck ...
Ich kann bestätigen, dass das Leck passiert: 6 Kunden valgrind gefunden 60 Bytes durchgesickert verbunden (Ich nehme an, die Clients haben sich vom selben Host aus verbunden, so dass das Wachstum wie erwartet linear ist, wenn es mit dem Hostnamen zusammenhängt.
Irgendeine Idee?

Prost

+0

Konnte immer die Quelle herunterladen und schauen, was es macht. –

+0

Und da es Open Source ist, können Sie das Problem selbst beheben! –

+0

Macht es vielleicht :-) – Emanuele

Antwort

3

fand schließlich die echte Leck.

Wenn Sie eine Verbindung zum Server-Socket herstellen, verwenden Sie name.local anstelle von localhost und/oder den vollständig qualifizierten Namen.
getnameinfo() wird dann undicht.

kann ich den Fehler auf 12.04, 12.10 beide x64 und x86 reproduzieren.
Wenn ich verbinde spezifizierend .local auf den Namen leckt es.

Prost