静的ライブラリ ( libpcap.a ) としてビルドされたバージョン1.1.1のlibpcapを使用しています。RHEL 6 64 ビットで次のコード ブロックを実行しようとすると (実行可能モジュール自体は 32 ビット ELF イメージとしてビルドされます)、セグメンテーション エラーが発生します。
const unsigned char* packet;
pcap_pkthdr pcap_header = {0};
unsigned short ether_type = 0;
while ( ether_type != ntohs( 0x800 ) )
{
packet = pcap_next ( m_pcap_handle, &pcap_header );
if (packet != NULL)
{
memcpy ( ðer_type, &( packet[ 12 ] ), 2 );
}
else
{
/*Sleep call goes here*/
}
}
if ( raw_buff ->data_len >= pcap_header.caplen )
{
memcpy ( raw_buff->data, &(packet[14]), pcap_header.len -14 );
raw_buff->data_len = pcap_header.len -14;
raw_buff->timestamp = pcap_header.ts;
}
少し調査したところ、 pcap_nextが戻ったときにpcap_header.lenフィールドがゼロに等しいことがわかりました。実際、caplenフィールドはパケット サイズを正しく反映しているようです。パケットアドレスからパケット メモリをダンプしようとすると、データは有効に見えます。ゼロに等しいlenフィールドの時点で、それが無効であることはわかっています。少なくともキャプレンの大きさであるはずです。バグですか?これを修正するには、どのような手順を踏む必要がありますか?
GDB はpcap_header の内容を次のように表示します。
(gdb) p pcap_header
$1 = {ts = {tv_sec = 5242946、tv_usec = 1361456997}、caplen = 66、len = 0}
たぶん、いくつかの回避策を適用できますか?libpcapのバージョンをアップグレードしたくありません。