getnameinfo() でハマった・・・

getnameinfo() を使ったアプリケーションが、それを呼んだ後しばらくして落ちるという現象に悩んでいました。


Program received signal EXC_BAD_INSTRUCTION, Illegal instruction/operand.

とか、妙な感じで・・・

gdb で where すると、


(gdb) where
#0 0x94a6593d in __abort ()
#1 0x94a48674 in __stack_chk_fail ()

と、どうやらスタックが壊れている様子。

いろいろと調べてみると・・・


char service[NI_NUMERICSERV];

if ( (rc = getnameinfo( (struct sockaddr *) &addr, sizeof(addr), hostname, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV)) == 0) {

さて、どこが変でしょう。

慣れた方ならすぐおわかりかもしれませんが、変数のサイズに NI_NUMERICSERV とフラグを与えてしまっています。

わかれば単純ですが、配列のオーバーフローを起こしていただけでした・・・



なかなか気がつかないものです。