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