[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 メーリングリストの案内