aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/tnef.c
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2018-11-10 23:03:16 +0100
committerMichael Mann <mmann78@netscape.net>2018-11-10 23:24:05 +0000
commit961f1388e443b5b08594ec7e9a8d9628f039d4d0 (patch)
tree0bbdcf78ce6f92b15090a67ac355d63ce12c444a /wiretap/tnef.c
parenta0bb983834c87a0aa6da7b9fe1f850139354c125 (diff)
wiretap: fix truncated reads while reading compressed file formats
A lot of file dissectors (pcapng, json, etc.) assumed that the packet size is equal to the file size. This is not true if the file was compressed and could result in silently truncating reads or failing to open a file (if the compressed file is larger than the actual data). Observe that a lot of file dissectors are simply copies of each other. Move the fixed implementation to wtap.c and reuse the methods everywhere else. While at it, avoid an unnecessary large allocation/read in ruby_marshal. Change-Id: I8e9cd0af9c4d1bd37789a3b509146ae2182a5379 Reviewed-on: https://code.wireshark.org/review/30570 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Reviewed-by: Dario Lombardo <lomato@gmail.com> Tested-by: Dario Lombardo <lomato@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'wiretap/tnef.c')
-rw-r--r--wiretap/tnef.c70
1 files changed, 2 insertions, 68 deletions
diff --git a/wiretap/tnef.c b/wiretap/tnef.c
index 224fbe2809..c169fecef8 100644
--- a/wiretap/tnef.c
+++ b/wiretap/tnef.c
@@ -14,72 +14,6 @@
#include <wsutil/buffer.h>
#include "tnef.h"
-static gboolean tnef_read_file(wtap *wth, FILE_T fh, wtap_rec *rec,
- Buffer *buf, int *err, gchar **err_info)
-{
- gint64 file_size;
- int packet_size;
-
- if ((file_size = wtap_file_size(wth, err)) == -1)
- return FALSE;
-
- if (file_size > WTAP_MAX_PACKET_SIZE_STANDARD) {
- /*
- * Probably a corrupt capture file; don't blow up trying
- * to allocate space for an immensely-large packet.
- */
- *err = WTAP_ERR_BAD_FILE;
- *err_info = g_strdup_printf("tnef: File has %" G_GINT64_MODIFIER "d-byte packet, bigger than maximum of %u",
- file_size, WTAP_MAX_PACKET_SIZE_STANDARD);
- return FALSE;
- }
- packet_size = (int)file_size;
-
- rec->rec_type = REC_TYPE_PACKET;
- rec->presence_flags = 0; /* yes, we have no bananas^Wtime stamp */
-
- rec->rec_header.packet_header.caplen = packet_size;
- rec->rec_header.packet_header.len = packet_size;
-
- rec->ts.secs = 0;
- rec->ts.nsecs = 0;
-
- return wtap_read_packet_bytes(fh, buf, packet_size, err, err_info);
-}
-
-static gboolean tnef_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
-{
- gint64 offset;
-
- *err = 0;
-
- offset = file_tell(wth->fh);
-
- /* there is only ever one packet */
- if (offset)
- return FALSE;
-
- *data_offset = offset;
-
- return tnef_read_file(wth, wth->fh, &wth->rec, wth->rec_data, err, err_info);
-}
-
-static gboolean tnef_seek_read(wtap *wth, gint64 seek_off,
- wtap_rec *rec,
- Buffer *buf, int *err, gchar **err_info)
-{
- /* there is only one packet */
- if(seek_off > 0) {
- *err = 0;
- return FALSE;
- }
-
- if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1)
- return FALSE;
-
- return tnef_read_file(wth, wth->random_fh, rec, buf, err, err_info);
-}
-
wtap_open_return_val tnef_open(wtap *wth, int *err, gchar **err_info)
{
guint32 magic;
@@ -99,8 +33,8 @@ wtap_open_return_val tnef_open(wtap *wth, int *err, gchar **err_info)
wth->file_encap = WTAP_ENCAP_TNEF;
wth->snapshot_length = 0;
- wth->subtype_read = tnef_read;
- wth->subtype_seek_read = tnef_seek_read;
+ wth->subtype_read = wtap_full_file_read;
+ wth->subtype_seek_read = wtap_full_file_seek_read;
wth->file_tsprec = WTAP_TSPREC_SEC;
return WTAP_OPEN_MINE;