diff options
author | Jeff Morriss <jeff.morriss@ulticom.com> | 2009-09-17 02:12:08 +0000 |
---|---|---|
committer | Jeff Morriss <jeff.morriss@ulticom.com> | 2009-09-17 02:12:08 +0000 |
commit | e95fe3793382276eeb3532fcfec264137218d339 (patch) | |
tree | 6ffc8c6948b50a5164ee6e104596d6cc307a4632 /wiretap/snoop.c | |
parent | 33026319607d08e53e3272362e92044186ddfd02 (diff) | |
download | wireshark-e95fe3793382276eeb3532fcfec264137218d339.tar.gz |
From Clay Jones via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3865 :
The Shomiti Wireless head was modified in a recent release such that wireshark
can no longer read Shomiti wireless capture files.
This new format is backwards compatible with the old format.
svn path=/trunk/; revision=29956
Diffstat (limited to 'wiretap/snoop.c')
-rw-r--r-- | wiretap/snoop.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/wiretap/snoop.c b/wiretap/snoop.c index 1f20f655ee..73c2f4ecd4 100644 --- a/wiretap/snoop.c +++ b/wiretap/snoop.c @@ -96,7 +96,7 @@ static gboolean snoop_seek_read(wtap *wth, gint64 seek_off, static gboolean snoop_read_atm_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, int *err); static gboolean snoop_read_shomiti_wireless_pseudoheader(FILE_T fh, - union wtap_pseudo_header *pseudo_header, int *err); + union wtap_pseudo_header *pseudo_header, int *err, int *header_size); static gboolean snoop_read_rec_data(FILE_T fh, guchar *pd, int length, int *err); static gboolean snoop_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, @@ -432,6 +432,7 @@ static gboolean snoop_read(wtap *wth, int *err, gchar **err_info, char padbuf[4]; guint padbytes; int bytes_to_read; + int header_size; /* Read record header. */ errno = WTAP_ERR_CANT_READ; @@ -525,16 +526,16 @@ static gboolean snoop_read(wtap *wth, int *err, gchar **err_info, return FALSE; } if (!snoop_read_shomiti_wireless_pseudoheader(wth->fh, - &wth->pseudo_header, err)) + &wth->pseudo_header, err, &header_size)) return FALSE; /* Read error */ /* * Don't count the pseudo-header as part of the packet. */ - rec_size -= (guint32)sizeof (shomiti_wireless_header); - orig_size -= (guint32)sizeof (shomiti_wireless_header); - packet_size -= (guint32)sizeof (shomiti_wireless_header); - wth->data_offset += sizeof (shomiti_wireless_header); + rec_size -= header_size; + orig_size -= header_size; + packet_size -= header_size; + wth->data_offset += header_size; break; } @@ -627,7 +628,7 @@ snoop_seek_read(wtap *wth, gint64 seek_off, case WTAP_ENCAP_IEEE_802_11_WITH_RADIO: if (!snoop_read_shomiti_wireless_pseudoheader(wth->random_fh, - pseudo_header, err)) { + pseudo_header, err, NULL)) { /* Read error */ return FALSE; } @@ -745,10 +746,12 @@ snoop_read_atm_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, static gboolean snoop_read_shomiti_wireless_pseudoheader(FILE_T fh, - union wtap_pseudo_header *pseudo_header, int *err) + union wtap_pseudo_header *pseudo_header, int *err, int *header_size) { shomiti_wireless_header whdr; int bytes_read; + char buffer[250]; + int rsize; errno = WTAP_ERR_CANT_READ; bytes_read = file_read(&whdr, 1, sizeof (shomiti_wireless_header), fh); @@ -759,12 +762,31 @@ snoop_read_shomiti_wireless_pseudoheader(FILE_T fh, return FALSE; } + /* the 4th byte of the pad is actually a header length, + * we've already read 8 bytes of it, and it is never + * less than 8 + */ + rsize = ((int) whdr.pad[3]) - 8; + if(rsize > 0) { + bytes_read = file_read(buffer, 1, rsize, fh); + if (bytes_read != rsize) { + *err = file_error(fh); + if (*err == 0) + *err = WTAP_ERR_SHORT_READ; + return FALSE; + } + } + pseudo_header->ieee_802_11.fcs_len = 4; pseudo_header->ieee_802_11.channel = whdr.channel; pseudo_header->ieee_802_11.data_rate = whdr.rate; pseudo_header->ieee_802_11.signal_level = whdr.signal; - return TRUE; + /* add back the header and don't forget the pad as well */ + if(header_size != NULL) + *header_size = rsize + 8 + 4; + + return TRUE; } static gboolean |