[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

ping でcrash



平松です。

NetBSD/i386(10月17日くらいの1.5Y)がインストールされているPCで、
ネットワークインターフェースが初期状態のままで以下のようにコマンドを
入力します。

# ifconfig fxp0 192.168.111.100
# route add default 192.168.111.1
# netstat -rn -f inet
Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use    Mtu  Interface
default            192.168.111.1      UGS         0        0      -  fxp0
127                127.0.0.1          UGRS        0        0  33220  lo0
127.0.0.1          127.0.0.1          UH          1        0  33220  lo0
192.168.111        link#1             UC          1        0      -  fxp0
192.168.111.1      link#1             UHLc        1        0      -  fxp0
# ifconfig fxp0 delete 192.168.111.100
# netstat -rn -f inet
Routing tables

Internet:
Destination        Gateway            Flags     Refs     Use    Mtu  Interface
default            192.168.111.1      UGS         0        0      -  fxp0
127                127.0.0.1          UGRS        0        0  33220  lo0
127.0.0.1          127.0.0.1          UH          1        0  33220  lo0

と、fxp0にはIPアドレスが無く、通信できないインターフェースなのにもかかわら
ずルーティングテーブルからfxp0が消えません。

ここで

# ping 224.1.1.1
# ping 255.255.255.255

などを実行するとip_output.cの317行目
                /*
                 * If source address not specified yet, use an address
                 * of outgoing interface.
                 */
                if (in_nullhost(ip->ip_src)) {
                        struct in_ifaddr *ia;

                        IFP_TO_IA(ifp, ia);
ここ -->                ip->ip_src = ia->ia_addr.sin_addr;
                }

で、実はNULLポインタらしいiaにアクセスしてcrashします。落ちるのはここ
なのですが、元々は206行目のrtallocでfxp0が戻って来るのが悪く、これは
fxp0のIPアドレスを消してもデフォルトルートに残っているのがそもそもの
原因な感じです。

ここまでは分かったのですが、どう直すのが正しいのかよく分からないので
メールしてみました。


なお、FreeBSDではインターフェースのIPアドレスと一緒にデフォルトルートも
消えます。またLinuxの場合、ifconfigを使ってはIPv4のアドレスは消せない(?)
のか、同じような操作ができませんでした。

----
// 平松 祥史
// hiramatu@boreas.dti.ne.jp