diff options
author | Bill Meier <wmeier@newsguy.com> | 2015-01-19 15:15:45 -0500 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2015-01-19 20:50:26 +0000 |
commit | 7e1d73d0d4d4852f14d5ac3e2dcf699d0467043b (patch) | |
tree | 5826d3b213132f353c834aec4c620b9dc65764d2 /epan | |
parent | d1cace99e57643a8f836803b2bc9cac50e42ac98 (diff) |
dmp, gmhdr, vssmonitoring: prevent possible crashes;
gmtime()/localtime() can return NULL.
Change-Id: If0589261429ee15d0c07972a99d94f9fe83626f6
Reviewed-on: https://code.wireshark.org/review/6660
Reviewed-by: Bill Meier <wmeier@newsguy.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-dmp.c | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-gmhdr.c | 7 | ||||
-rw-r--r-- | epan/dissectors/packet-vssmonitoring.c | 7 |
3 files changed, 15 insertions, 3 deletions
diff --git a/epan/dissectors/packet-dmp.c b/epan/dissectors/packet-dmp.c index 3ba0b65f7b..d3221ab6f2 100644 --- a/epan/dissectors/packet-dmp.c +++ b/epan/dissectors/packet-dmp.c @@ -156,6 +156,7 @@ void proto_reg_handoff_dmp(void); #define DMP_TIME_RESERVED -2 #define ILLEGAL_FORMAT "<Illegal format>" +#define TIME_NOT_REPRESENTABLE "<Time not representable>" /* Maximum lengths */ #define MAX_SIC_LEN 30 @@ -1687,6 +1688,9 @@ static const gchar *dissect_thales_ipm_id (tvbuff_t *tvb, gint offset, gint leng time_t timev = tvb_get_ntohl(tvb, offset + length - 4); struct tm *tmp = gmtime(&timev); + if (tmp == NULL) + return TIME_NOT_REPRESENTABLE; + if (modifier == 1 && number >= 1024) { /* The number is in the range 65536-99999 */ number_len = 5; diff --git a/epan/dissectors/packet-gmhdr.c b/epan/dissectors/packet-gmhdr.c index da847f85e1..6447c58ab0 100644 --- a/epan/dissectors/packet-gmhdr.c +++ b/epan/dissectors/packet-gmhdr.c @@ -313,13 +313,18 @@ dissect_gmtimestamp_trailer(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t if (gmtrailer_summary_in_tree) { offset += 4; port_num = tvb_get_ntohs(tvb, offset); + proto_item_append_text(ti, ", Port: %d, Timestamp: ", port_num); offset += 2; + gmtimev.secs = tvb_get_ntohl(tvb, offset); offset += 4; gmtimev.nsecs = tvb_get_ntohl(tvb, offset); tm = localtime(&gmtimev.secs); - proto_item_append_text(ti, ", Port: %d, Timestamp: %d:%02d:%02d.%09d", port_num, tm->tm_hour, tm->tm_min, tm->tm_sec, gmtimev.nsecs); + if (tm) + proto_item_append_text(ti, "%d:%02d:%02d.%09d", tm->tm_hour, tm->tm_min, tm->tm_sec, gmtimev.nsecs); + else + proto_item_append_text(ti, "<Not representable>"); } offset = 0; diff --git a/epan/dissectors/packet-vssmonitoring.c b/epan/dissectors/packet-vssmonitoring.c index 6679785d13..565a36bc75 100644 --- a/epan/dissectors/packet-vssmonitoring.c +++ b/epan/dissectors/packet-vssmonitoring.c @@ -172,8 +172,11 @@ dissect_vssmonitoring(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void proto_tree_add_uint(vssmonitoring_tree, hf_vssmonitoring_clksrc, tvb, offset + 4, 1, vssmonitoring_clksrc); tmp = localtime(&vssmonitoring_time.secs); - proto_item_append_text(ti, ", Timestamp: %02d:%02d:%02d.%09ld", - tmp->tm_hour, tmp->tm_min, tmp->tm_sec,(long)vssmonitoring_time.nsecs); + if (tmp) + proto_item_append_text(ti, ", Timestamp: %02d:%02d:%02d.%09ld", + tmp->tm_hour, tmp->tm_min, tmp->tm_sec,(long)vssmonitoring_time.nsecs); + else + proto_item_append_text(ti, ", Timestamp: <Not representable>"); } offset += 8; } |