1

コードスニペットを見てください

char ipAddr[] = {192, 168, 88, 2};
struct iphdr *ip_hdr = (struct iphdr*)(some_valid_eth_hdr_pointer + 1);
if (0 == memcmp((void*)(ip_hdr->saddr), (void*)ipAddr, 4)) /*memcmp cause my whole system crashed*/
{
    printk("ip source addr matched\n");
}

コードはLinux の netfilter フック関数から抽出されます。つまり、ip_hdr->saddrがカーネル空間メモリに属している可能性があり、ip_hdr が有効なメモリを指していると確信しています。まだ何が問題なのかわからないので、助けてください。

前もって感謝します !

4

1 に答える 1

1

さて、ここにあなたの問題があります:

memcmp((void*)(ip_hdr->saddr), ...

これは、送信元 IP アドレスをポインターとして解釈します。あなたがやりたかったことはこれでした:

memcmp(&ip_hdr->saddr, ...)
于 2012-04-21T16:28:42.480 に答える