Segmentation fault

家の機器に組み込んでいるbuildroot環境のuClibcを、最新の0.9.30に更新しようとしたら、sshdやntpdate、pingなどでSegmentation fault発生。


解決したんだが、とりあえず今はここには書かずに、今度のLTネタにでもするか?


追記(12/31):結局LTのネタにはしなかったんで、ここに症状だけ書いとく。

なんでSegmentation faultが起きたかというと、IPアドレスを割り振っていないEtherインタフェースがあったため。割り振っていないと、ある構造体がぬるぽになるんだが、そのNULLチェックをしていない所があったため。
元のコードは以下の通り。runp->ifa_addrのNULLチェックをしていない。

                for (runp = ifa; runp != NULL; runp = runp->ifa_next)
#if defined __UCLIBC_HAS_IPV4__
                        if (runp->ifa_addr->sa_family == PF_INET)
                                seen |= SEEN_IPV4;
#endif /* __UCLIBC_HAS_IPV4__ */
#if defined __UCLIBC_HAS_IPV6__
                        if (runp->ifa_addr->sa_family == PF_INET6)
                                seen |= SEEN_IPV6;
#endif /* __UCLIBC_HAS_IPV6__ */

しかも、よくこのコードをみてもらうと分かるけど、for文に"{"と"}"がないのでIPv4IPv6を同時に設定すると、IPv6用のif文でSegmentation fault。
svnを追っかけてみると、以前if文の間にelseが挟まっていたが、なくなってしまったみたい。


取り合えず本家にパッチを投げて解決。
ちょいと、uClibcの品質ってどうなの?とか思ってしまった…


あ、ちなみにこのコードは0.9.29にはありません。念のため。