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 の損失レコード 1 で確実に失われます
==4425== 0x4C2B6CD: malloc (/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 内)
==4425== by 0x50D7D71: strdup (strdup.c:43)
==4425== by 0x1484B861: ???
==4425== by 0x515B871: gethostbyaddr_r@@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.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.0412.10両方でバグを再現できます。 名前を指定して接続すると漏れます。
.local

乾杯

于 2012-12-31T10:34:29.673 に答える