From ce9f47117572d8b5c8854bd850bee108431b8d80 Mon Sep 17 00:00:00 2001 From: Bill Meier Date: Wed, 20 Oct 2010 17:20:56 +0000 Subject: [PATCH] From Jeff Morriss: Fix crash: WTAP_ERR_BAD_RECORD error return needs to fill in *err_info. From me: For ipfix_open() don't actually return with *err=WTAP_ERR_BAD_RECORD. Also: Move #define RECORDS_FOR_IPFIX_CHECK to ipfix.c from ipfix.h since the definition is only used in ipfix.c. svn path=/trunk/; revision=34589 --- wiretap/ipfix.c | 21 +++++++++++++++------ wiretap/ipfix.h | 2 -- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/wiretap/ipfix.c b/wiretap/ipfix.c index 5e15c1f1bc..b61bea10e0 100644 --- a/wiretap/ipfix.c +++ b/wiretap/ipfix.c @@ -87,6 +87,8 @@ #define ipfix_debug3(str,p1,p2,p3) #endif +#define RECORDS_FOR_IPFIX_CHECK 20 + static gboolean ipfix_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset); @@ -123,10 +125,10 @@ typedef struct ipfix_set_header_s { * 0 on EOF, any other value for "real" errors (EOF is ok, since return * value is still FALSE) */ - static gboolean +static gboolean ipfix_read_message_header(ipfix_message_header_t *pfx_hdr, FILE_T fh, int *err, gchar **err_info) { - wtap_file_read_expected_bytes(pfx_hdr, IPFIX_MSG_HDR_SIZE, fh, err); + wtap_file_read_expected_bytes(pfx_hdr, IPFIX_MSG_HDR_SIZE, fh, err); /* macro which does a return if read fails */ /* fix endianess, because IPFIX files are always big-endian */ pfx_hdr->version = g_ntohs(pfx_hdr->version); @@ -139,6 +141,7 @@ ipfix_read_message_header(ipfix_message_header_t *pfx_hdr, FILE_T fh, int *err, if (pfx_hdr->version != IPFIX_VERSION) { /* Not an ipfix file. */ *err = WTAP_ERR_BAD_RECORD; + *err_info = g_strdup_printf("ipfix: wrong version %d", pfx_hdr->version); return FALSE; } @@ -188,10 +191,16 @@ ipfix_open(wtap *wth, int *err, gchar **err_info) for (i = 0; i < records_for_ipfix_check; i++) { /* read first message header to check version */ if (!ipfix_read_message_header(&msg_hdr, wth->fh, err, err_info)) { - ipfix_debug2("ipfix_open: couldn't read message header #%d with err code #%d", - i, *err); - if (*err == WTAP_ERR_BAD_RECORD) return 0; - if (*err != 0) return -1; /* real failure */ + ipfix_debug3("ipfix_open: couldn't read message header #%d with err code #%d (%s)", + i, *err, *err_info); + if (*err == WTAP_ERR_BAD_RECORD) { + *err = 0; /* not actually an error in this case */ + g_free(*err_info); + *err_info = NULL; + return 0; + } + if (*err != 0) + return -1; /* real failure */ /* else it's EOF */ if (i < 1) { /* we haven't seen enough to prove this is a ipfix file */ diff --git a/wiretap/ipfix.h b/wiretap/ipfix.h index 0f891a48fe..681a0d451f 100644 --- a/wiretap/ipfix.h +++ b/wiretap/ipfix.h @@ -23,8 +23,6 @@ #ifndef __W_IPFIX_H__ #define __W_IPFIX_H__ -#define RECORDS_FOR_IPFIX_CHECK 20 - int ipfix_open(wtap *wth, int *err, gchar **err_info); #endif