[Armadillo:01769] Re: Armadillo-210のdhcpdでのエラー
Shin-ya Koga
email@hidden
2007年 7月 18日 (水) 09:49:13 JST
こんにちは。古賀といいます。
林田さん([Armadillo:01760]):
>上記タイトルのエラーですが何とか解決できました。
>小俣さんに提供していただいたdhcpdumpのおかげで、問題をカーネルと切り離す
>ことができたので、ISC-DHCPのバグと決め打ちし、ソースとにらめっこしました。
>ソース中のエラーを吐いていた関数(decode_udp_ip_header)をgrepで特定し、再度
>ググリ直し、ISC-DHCP 3.0.3で修正された下記の問題を見つけました。
>
>decode_udp_ip_header was changed so that the IP address was copied out to a
>variable,
>rather than referenced by a pointer. This enforces 4-byte alignment of the
>32-bit IP
>address value. Thanks to a patch from Dr. Peter Poeml.
>詳細はわかりませんが、カーネルから渡されたパケットのヘッダデータを配列(構造体)
>に格納(decode_udp_ip_headerの仕事)する際に、ずれて、値が壊れていただけのようです。
これですが、UDP パケットのペイロードに格納された DHCP メッセージを
解析(デコード)する際、32bit の IPv4 アドレスを、4byte のアライン
メントを考慮せずにアクセスしていたのが原因ですね。おそらく、UDP
パケット中の DHCP メッセージヘッダ部を、構造体に cast してアクセス
していた部分を修正し、IPv4 アドレスのフィールド値を一旦ローカル変
数にコピーして(つまり、4byte アラインメントを確保して)アクセス
することで、データ化けが起きてしまうことを回避した、ということなの
でしょう。
当該ソースは見ていませんが、以前に、別の DHCP サーバを ARM コアの
チップへ移植した際、同様の不具合に遭遇し、上で述べた修正を行った
経験があります。
x86 だと起きない不具合なので、x86 Linux ベースで開発を始めた場合に、
やってしまうことが多い不具合かなと思います。これについては、
http://jr0bak.homelinux.net/~imai/linux/arm_gcc_badknowhow/arm_gcc_badknowhow-4.html
などが参考になるんじゃないかと思います。
以上、参考になりましたら幸いです。
--
古賀信哉 (株)サムシングプレシャス
armadillo メーリングリストの案内