diff options
author | Peter Wu <peter@lekensteyn.nl> | 2018-11-10 23:03:16 +0100 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2018-11-10 23:24:05 +0000 |
commit | 961f1388e443b5b08594ec7e9a8d9628f039d4d0 (patch) | |
tree | 0bbdcf78ce6f92b15090a67ac355d63ce12c444a /wiretap/mime_file.c | |
parent | a0bb983834c87a0aa6da7b9fe1f850139354c125 (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/mime_file.c')
-rw-r--r-- | wiretap/mime_file.c | 81 |
1 files changed, 2 insertions, 79 deletions
diff --git a/wiretap/mime_file.c b/wiretap/mime_file.c index 021f27a5e7..88bf207ea8 100644 --- a/wiretap/mime_file.c +++ b/wiretap/mime_file.c @@ -81,83 +81,6 @@ static const mime_files_t magic_files[] = { #define N_MAGIC_TYPES (sizeof(magic_files) / sizeof(magic_files[0])) -/* - * Impose a not-too-large limit on the maximum file size, to avoid eating - * up 99% of the (address space, swap partition, disk space for swap/page - * files); if we were to return smaller chunks and let the dissector do - * reassembly, it would *still* have to allocate a buffer the size of - * the file, so it's not as if we'd neve try to allocate a buffer the - * size of the file. - */ -#define MAX_FILE_SIZE G_MAXINT - -static gboolean -mime_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 > MAX_FILE_SIZE) { - /* - * Don't blow up trying to allocate space for an - * immensely-large file. - */ - *err = WTAP_ERR_BAD_FILE; - *err_info = g_strdup_printf("mime_file: File has %" G_GINT64_MODIFIER "d-byte packet, bigger than maximum of %u", - file_size, MAX_FILE_SIZE); - 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 -mime_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 != 0) - return FALSE; - - *data_offset = offset; - - return mime_read_file(wth, wth->fh, &wth->rec, wth->rec_data, err, err_info); -} - -static gboolean -mime_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 mime_read_file(wth, wth->random_fh, rec, buf, err, err_info); -} - wtap_open_return_val mime_file_open(wtap *wth, int *err, gchar **err_info) { @@ -206,8 +129,8 @@ mime_file_open(wtap *wth, int *err, gchar **err_info) wth->file_type_subtype = WTAP_FILE_TYPE_SUBTYPE_MIME; wth->file_encap = WTAP_ENCAP_MIME; wth->file_tsprec = WTAP_TSPREC_SEC; - wth->subtype_read = mime_read; - wth->subtype_seek_read = mime_seek_read; + wth->subtype_read = wtap_full_file_read; + wth->subtype_seek_read = wtap_full_file_seek_read; wth->snapshot_length = 0; return WTAP_OPEN_MINE; |