aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap
diff options
context:
space:
mode:
authorMichael Tüxen <tuexen@fh-muenster.de>2009-06-28 11:09:24 +0000
committerMichael Tüxen <tuexen@fh-muenster.de>2009-06-28 11:09:24 +0000
commit393214bc6b4dccfc780fc6d0d04771207a0e475a (patch)
tree03170d1830a4ec20404932525fb26c63463a3e48 /wiretap
parent486f55b7b9b2c3523d6e0badbb4fe3e1d2cfe0b8 (diff)
Stop loading a pcapng file with multiple section header blocks.
This fixes a bug reported by Tyson Key as a follow up of Bug 3560. Also some cleanups and debug output improvements. Thanks to Tyson Key for reporting the bug and providing a tracefile. This fix will be included in Wireshark 1.2.1 and higher. svn path=/trunk/; revision=28868
Diffstat (limited to 'wiretap')
-rw-r--r--wiretap/pcapng.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/wiretap/pcapng.c b/wiretap/pcapng.c
index 88d9ada5f5..f3bc3a2f71 100644
--- a/wiretap/pcapng.c
+++ b/wiretap/pcapng.c
@@ -341,7 +341,7 @@ pcapng_read_option(FILE_T fh, pcapng_t *pn, pcapng_option_header_t *oh,
static int
pcapng_read_section_header_block(FILE_T fh, pcapng_block_header_t *bh,
pcapng_t *pn, wtapng_block_t *wblock, int *err,
- gchar **err_info _U_)
+ gchar **err_info)
{
int bytes_read;
int block_read;
@@ -392,14 +392,14 @@ pcapng_read_section_header_block(FILE_T fh, pcapng_block_header_t *bh,
}
/* we currently only understand SHB V1.0 */
- if(pn->version_major != 1 || pn->version_minor != 0) {
+ if (pn->version_major != 1 || pn->version_minor != 0) {
pcapng_debug2("pcapng_read_section_header_block: unknown SHB version %u.%u",
pn->version_major, pn->version_minor);
return 0;
}
/* 64bit section_length (currently unused) */
- if(pn->byte_swapped) {
+ if (pn->byte_swapped) {
wblock->data.section.section_length = BSWAP64(shb.section_length);
} else {
wblock->data.section.section_length = shb.section_length;
@@ -475,7 +475,12 @@ pcapng_read_section_header_block(FILE_T fh, pcapng_block_header_t *bh,
}
if (pn->interface_data != NULL) {
+ pcapng_debug0("pcapng_read_section_header_block: Multiple section header blocks!");
g_array_free(pn->interface_data, TRUE);
+ pn->interface_data = NULL;
+ *err = WTAP_ERR_BAD_RECORD;
+ *err_info = g_strdup_printf("pcapng: multiple section header blocks not supported.");
+ return 0;
}
pn->interface_data = g_array_new(FALSE, FALSE, sizeof(interface_data_t));
pn->number_of_interfaces = 0;
@@ -697,7 +702,7 @@ pcapng_read_packet_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wta
pcapng_packet_block_t pb;
guint32 block_total_length;
pcapng_option_header_t oh;
- gint encap;
+ gint wtap_encap;
int pseudo_header_len;
char option_content[100]; /* XXX - size might need to be increased, if we see longer options */
@@ -771,14 +776,16 @@ pcapng_read_packet_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wta
wblock->data.packet.cap_len,
wblock->data.packet.interface_id);
- encap = pcapng_get_encap(wblock->data.packet.interface_id, pn);
- pcapng_debug1("pcapng_read_packet_block: Need to read pseudo header of size %d",
- pcap_get_phdr_size(encap, wblock->pseudo_header));
+ wtap_encap = pcapng_get_encap(wblock->data.packet.interface_id, pn);
+ pcapng_debug3("pcapng_read_packet_block: encapsulation = %d (%s), pseudo header size = %d.",
+ wtap_encap,
+ wtap_encap_string(wtap_encap),
+ pcap_get_phdr_size(wtap_encap, wblock->pseudo_header));
memset((void *)wblock->pseudo_header, 0, sizeof(union wtap_pseudo_header));
pseudo_header_len = pcap_process_pseudo_header(fh,
WTAP_FILE_PCAPNG,
- encap,
+ wtap_encap,
pn->byte_swapped,
wblock->data.packet.cap_len,
TRUE,
@@ -791,7 +798,7 @@ pcapng_read_packet_block(FILE_T fh, pcapng_block_header_t *bh, pcapng_t *pn, wta
}
wblock->data.packet.pseudo_header_len = (guint32)pseudo_header_len;
block_read += pseudo_header_len;
- if (pseudo_header_len != pcap_get_phdr_size(encap, wblock->pseudo_header)) {
+ if (pseudo_header_len != pcap_get_phdr_size(wtap_encap, wblock->pseudo_header)) {
pcapng_debug1("pcapng_read_packet_block: Could only read %d bytes for pseudo header.",
pseudo_header_len);
}
@@ -1372,8 +1379,9 @@ pcapng_seek_read(wtap *wth, gint64 seek_off,
/* read the block */
bytes_read = pcapng_read_block(wth->random_fh, wth->capture.pcapng, &wblock, err, err_info);
if (bytes_read <= 0) {
- *err = file_error(wth->fh);
- pcapng_debug0("pcapng_seek_read: couldn't read packet block");
+ *err = file_error(wth->random_fh);
+ pcapng_debug3("pcapng_seek_read: couldn't read packet block (err=%d, errno=%d, bytes_read=%d).",
+ *err, errno, bytes_read);
return FALSE;
}