[Armadillo:08301] busybox のnslookupのバグ
Yasuhisa Nakamura
email@hidden
2012年 9月 4日 (火) 07:03:38 JST
中村です。
MLの過去に、この話題はなかったと思いますので、書いておきます。
busyboxのnslookupで、第2引数でサーバーを指定したとき
おかしな挙動を示していたので調べてみました。
結論は、第2引数で指定したサーバーは使われていません。
この問題のためにソースをみてみたら、別の問題もありました。
(1) 第2引数で指定したサーバーは使われない。
(2) /etc/resolv.confに複数のサーバがあり1つ目が死んでいるとき
まず(1)から。
ソースをみてみると、
if(inet_aton(server,&server_in_addr))
{
_res.nscount = 1;
_res.nsaddr_list[0].sin_addr = server_in_addr;
}
という部分があります。
_res.nsaddr_list[]は/etc/resolv.confが展開されたもので、
これの[0]を強引に書き換えて、問い合わせのサーバーを
第2引数のものに変更しているのですが、
libcのgethostbyaddr()やgethostbyname()が実行されるときには、
この_res.nsaddr_list[]配列は元にもどされてしまうため、
第2引数で指定したサーバーは使われない、ということに
なってしまっているようです。
WireSharkでパケットキャプチャして、第2引数のサーバーが
使われないことを確認しました。
ネットで情報を探してみると、この問題をlibcのMLに
ポストしている人がいました。
http://sourceware.org/ml/libc-help/2009-11/msg00011.html
(この記事内に https://bugs.busybox.net/show_bug.cgi?id=675 への
リンクもあるのですけど、ブラウザが「このサイトの証明書は
信頼性を検証できません」と)
また、こういうのもありました。
http://ubuntuforums.org/archive/index.php/t-1743450.html
ubuntu-11.04では発生するけども、RedHatやFeforaでは
発生しないらしい、ということのようです。
ArmadilloのlibcはDebian系のものですよね。
Debian系はこの方法ではダメ!ってことのようです。
(2) /etc/resolv.confに複数のサーバがあり1つ目が死んでいるとき
たとえば、/etc/nslookupに複数のDNSサーバが設定されていて、
1番目のサーバが死んでいるときでも、結果表示は1番目の
サーバから結果を得た、というような表示になります。
しかし実際には、1番目が死んでいるときには2番目(以降)の
サーバから結果を得ています。
こうなる理由は、ソースを見ればすぐにわかると思いますので、
説明は省略させてもらいます。
--
なかむら
armadillo メーリングリストの案内