diff --git a/wireshark-0006-From-Peter-Lemenkov-via-https-bugs.wireshark.org-bug.patch b/wireshark-0006-From-Peter-Lemenkov-via-https-bugs.wireshark.org-bug.patch index bdb7852..0828087 100644 --- a/wireshark-0006-From-Peter-Lemenkov-via-https-bugs.wireshark.org-bug.patch +++ b/wireshark-0006-From-Peter-Lemenkov-via-https-bugs.wireshark.org-bug.patch @@ -195,6 +195,12 @@ From me: Remove dereferencing operator from 'ipaddr' in two calls to svn path=/trunk/; revision=54156 +Add numeric types instead of string where possible in the RTPproxy dissector. Bug 9561 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9561) + +From Peter Lemenkov + +svn path=/trunk/; revision=54467 + diff --git a/AUTHORS b/AUTHORS index 10782b0..e7b3c18 100644 --- a/AUTHORS @@ -233,10 +239,10 @@ index 937f522..73217d7 100644 packet-rudp.c \ diff --git a/epan/dissectors/packet-rtpproxy.c b/epan/dissectors/packet-rtpproxy.c new file mode 100644 -index 0000000..2c8fba3 +index 0000000..e8c5c95 --- /dev/null +++ b/epan/dissectors/packet-rtpproxy.c -@@ -0,0 +1,1386 @@ +@@ -0,0 +1,1394 @@ +/* packet-rtpproxy.c + * RTPproxy command protocol dissector + * Copyright 2013, Peter Lemenkov @@ -564,7 +570,8 @@ index 0000000..2c8fba3 + while(codecs[i]){ + /* We assume strings < 2^32-1 bytes long. :-) */ + codec_len = (guint)strlen(codecs[i]); -+ ti = proto_tree_add_item(another_tree, hf_rtpproxy_command_parameter_codec, tvb, begin+offset, codec_len, ENC_ASCII | ENC_NA); ++ ti = proto_tree_add_uint(another_tree, hf_rtpproxy_command_parameter_codec, tvb, begin+offset, codec_len, ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, begin+offset, codec_len), NULL, 10)); + proto_item_append_text(ti, " (%s)", val_to_str_ext((guint)strtoul(tvb_format_text(tvb,begin+offset,codec_len),NULL,10), &rtp_payload_type_vals_ext, "Unknown")); + offset += codec_len; + if(codecs[i+1]) @@ -588,14 +595,16 @@ index 0000000..2c8fba3 + case 'z': + new_offset = (gint)strspn(rawstr+offset, "0123456789"); + another_tree = proto_item_add_subtree(ti, ett_rtpproxy_command_parameters_repacketize); -+ proto_tree_add_item(another_tree, hf_rtpproxy_command_parameter_repacketize, tvb, begin+offset, new_offset, ENC_ASCII | ENC_NA); ++ proto_tree_add_uint(another_tree, hf_rtpproxy_command_parameter_repacketize, tvb, begin+offset, new_offset, ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, begin+offset, new_offset), NULL, 10)); + offset += new_offset; + break; + /* Unofficial long parameters */ + case 'd': + new_offset = (gint)strspn(rawstr+offset, "0123456789"); + another_tree = proto_item_add_subtree(ti, ett_rtpproxy_command_parameters_dtmf); -+ proto_tree_add_item(another_tree, hf_rtpproxy_command_parameter_dtmf, tvb, begin+offset, new_offset, ENC_ASCII | ENC_NA); ++ proto_tree_add_uint(another_tree, hf_rtpproxy_command_parameter_dtmf, tvb, begin+offset, new_offset, ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, begin+offset, new_offset), NULL, 10)); + if(rtpproxy_establish_conversation){ + pt = (guint)strtoul(tvb_format_text(tvb,begin+offset,new_offset),NULL,10); + dissector_add_uint("rtp.pt", pt, rtp_events_handle); @@ -615,7 +624,8 @@ index 0000000..2c8fba3 + case 't': + new_offset = (gint)strspn(rawstr+offset, "0123456789"); + another_tree = proto_item_add_subtree(ti, ett_rtpproxy_command_parameters_transcode); -+ ti = proto_tree_add_item(another_tree, hf_rtpproxy_command_parameter_transcode, tvb, begin+offset, new_offset, ENC_ASCII | ENC_NA); ++ ti = proto_tree_add_uint(another_tree, hf_rtpproxy_command_parameter_transcode, tvb, begin+offset, new_offset, ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, begin+offset, new_offset), NULL, 10)); + proto_item_append_text(ti, " (%s)", val_to_str_ext((guint)strtoul(tvb_format_text(tvb,begin+offset, new_offset),NULL,10), &rtp_payload_type_vals_ext, "Unknown")); + offset += new_offset; + break; @@ -693,14 +703,16 @@ index 0000000..2c8fba3 + proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_ipv6, tvb, begin, offset - begin, ENC_ASCII | ENC_NA); + else + proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_ipv4, tvb, begin, offset - begin, ENC_ASCII | ENC_NA); -+ proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_port, tvb, offset+1, end - (offset+1), ENC_ASCII | ENC_NA); ++ proto_tree_add_uint(rtpproxy_tree, hf_rtpproxy_notify_port, tvb, offset+1, end - (offset+1), ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, offset+1, end - (offset+1)), NULL, 10)); + } + else{ + /* Only port is supplied */ + ti = proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_ipv4, tvb, begin, 0, ENC_ASCII | ENC_NA); + proto_item_append_text(ti, ""); + PROTO_ITEM_SET_GENERATED(ti); -+ proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_port, tvb, begin, end - begin, ENC_ASCII | ENC_NA); ++ proto_tree_add_uint(rtpproxy_tree, hf_rtpproxy_notify_port, tvb, begin, end - begin, ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, begin, end - begin), NULL, 10)); + } +} + @@ -865,7 +877,8 @@ index 0000000..2c8fba3 + + /* Extract Port */ + new_offset = tvb_find_guint8(tvb, offset, -1, ' '); -+ proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_port, tvb, offset, new_offset - offset, ENC_ASCII | ENC_NA); ++ proto_tree_add_uint(rtpproxy_tree, hf_rtpproxy_port, tvb, offset, new_offset - offset, ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, offset, new_offset - offset), NULL, 10)); + /* Skip whitespace */ + offset = tvb_skip_wsp(tvb, new_offset+1, -1); + } @@ -888,7 +901,8 @@ index 0000000..2c8fba3 + + /* Extract codec */ + new_offset = tvb_find_guint8(tvb, offset, -1, ' '); -+ proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_playback_codec, tvb, offset, new_offset - offset, ENC_ASCII | ENC_NA); ++ proto_tree_add_uint(rtpproxy_tree, hf_rtpproxy_playback_codec, tvb, offset, new_offset - offset, ++ (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, offset, new_offset - offset), NULL, 10)); + /* Skip whitespace */ + offset = tvb_skip_wsp(tvb, new_offset+1, -1); + } @@ -986,7 +1000,7 @@ index 0000000..2c8fba3 + new_offset = tvb_find_guint8(tvb, offset, -1, ' '); + /* Convert port to unsigned 16-bit number */ + port = (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, offset, new_offset - offset), NULL, 10); -+ proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_port, tvb, offset, new_offset - offset, ENC_ASCII | ENC_NA); ++ proto_tree_add_uint(rtpproxy_tree, hf_rtpproxy_port, tvb, offset, new_offset - offset, port); + /* Skip whitespace */ + offset = tvb_skip_wsp(tvb, new_offset+1, -1); + @@ -1141,8 +1155,8 @@ index 0000000..2c8fba3 + { + "Port", + "rtpproxy.port", -+ FT_STRING, -+ BASE_NONE, ++ FT_UINT16, /* 0 - 65535 */ ++ BASE_DEC, + NULL, + 0x0, + NULL, @@ -1206,8 +1220,8 @@ index 0000000..2c8fba3 + { + "Allowed codec", + "rtpproxy.command_parameter_codec", -+ FT_STRING, -+ BASE_NONE, ++ FT_UINT8, /* 0 - 127 */ ++ BASE_DEC, + NULL, + 0x0, + NULL, @@ -1245,8 +1259,8 @@ index 0000000..2c8fba3 + { + "Repacketize (ms)", + "rtpproxy.command_parameter_repacketize", -+ FT_STRING, -+ BASE_NONE, ++ FT_UINT16, /* 0 - 1000 milliseconds */ ++ BASE_DEC, + NULL, + 0x0, + NULL, @@ -1258,8 +1272,8 @@ index 0000000..2c8fba3 + { + "DTMF payload ID", + "rtpproxy.command_parameter_dtmf", -+ FT_STRING, -+ BASE_NONE, ++ FT_UINT8, /* 0 - 127 */ ++ BASE_DEC, + NULL, + 0x0, + NULL, @@ -1284,8 +1298,8 @@ index 0000000..2c8fba3 + { + "Transcode to", + "rtpproxy.command_parameter_transcode", -+ FT_STRING, -+ BASE_NONE, ++ FT_UINT8, /* 0 - 127 */ ++ BASE_DEC, + NULL, + 0x0, + NULL, @@ -1310,7 +1324,7 @@ index 0000000..2c8fba3 + { + "Copy target", + "rtpproxy.copy_target", -+ FT_STRING, ++ FT_STRING, /* Filename or UDP address, e.g. /var/tmp/fileXXXX.yyy or IP:Port */ + BASE_NONE, + NULL, + 0x0, @@ -1336,8 +1350,8 @@ index 0000000..2c8fba3 + { + "Playback codec", + "rtpproxy.playback_codec", -+ FT_STRING, -+ BASE_NONE, ++ FT_UINT8, /* 0 - 127 */ ++ BASE_DEC, + NULL, + 0x0, + NULL, @@ -1427,8 +1441,8 @@ index 0000000..2c8fba3 + { + "Notification Port", + "rtpproxy.notify_port", -+ FT_STRING, -+ BASE_NONE, ++ FT_UINT16, ++ BASE_DEC, + NULL, + 0x0, + NULL, diff --git a/wireshark-0022-Fix-IP-types.patch b/wireshark-0022-Fix-IP-types.patch new file mode 100644 index 0000000..099bfd0 --- /dev/null +++ b/wireshark-0022-Fix-IP-types.patch @@ -0,0 +1,299 @@ +From: Peter Lemenkov +Date: Fri, 13 Dec 2013 22:10:21 +0400 +Subject: [PATCH] Fix IP types + +Signed-off-by: Peter Lemenkov + +diff --git a/epan/dissectors/packet-rtpproxy.c b/epan/dissectors/packet-rtpproxy.c +index e8c5c95..6291de3 100644 +--- a/epan/dissectors/packet-rtpproxy.c ++++ b/epan/dissectors/packet-rtpproxy.c +@@ -40,6 +40,9 @@ + #include + #include + ++#include ++#include ++ + #ifdef HAVE_ARPA_INET_H + #include + #endif +@@ -69,8 +72,8 @@ static int hf_rtpproxy_command = -1; + static int hf_rtpproxy_command_parameters = -1; + static int hf_rtpproxy_command_parameter = -1; + static int hf_rtpproxy_command_parameter_codec = -1; +-static int hf_rtpproxy_command_parameter_local = -1; +-static int hf_rtpproxy_command_parameter_remote = -1; ++static int hf_rtpproxy_command_parameter_local_ipv4 = -1; ++static int hf_rtpproxy_command_parameter_remote_ipv4 = -1; + static int hf_rtpproxy_command_parameter_repacketize = -1; + static int hf_rtpproxy_command_parameter_dtmf = -1; + /* static int hf_rtpproxy_command_parameter_cmap = -1; TODO */ +@@ -294,8 +297,8 @@ rtpproxy_add_tag(proto_tree *rtpproxy_tree, tvbuff_t *tvb, guint begin, guint re + return (end == realsize ? -1 : (gint)end); + } + +-void +-rtpproxy_add_parameter(proto_tree *rtpproxy_tree, tvbuff_t *tvb, guint begin, guint realsize) ++static void ++rtpproxy_add_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *rtpproxy_tree, guint begin, guint realsize) + { + proto_item *ti; + proto_tree *another_tree = NULL; +@@ -306,6 +309,7 @@ rtpproxy_add_parameter(proto_tree *rtpproxy_tree, tvbuff_t *tvb, guint begin, gu + gchar** codecs = NULL; + guint codec_len; + guint8* rawstr = NULL; ++ guint32 ipaddr[4]; /* Enough room for IPv4 or IPv6 */ + + /* Extract the entire parameters line. */ + /* Something like "t4p1iic8,0,2,4,18,96,97,98,100,101" */ +@@ -338,13 +342,19 @@ rtpproxy_add_parameter(proto_tree *rtpproxy_tree, tvbuff_t *tvb, guint begin, gu + case 'l': + new_offset = (gint)strspn(rawstr+offset, "0123456789."); + another_tree = proto_item_add_subtree(ti, ett_rtpproxy_command_parameters_local); +- proto_tree_add_item(another_tree, hf_rtpproxy_command_parameter_local, tvb, begin+offset, new_offset, ENC_ASCII | ENC_NA); ++ if(inet_pton(AF_INET, (char*)tvb_get_ephemeral_string(tvb, begin+offset, new_offset), ipaddr)) ++ proto_tree_add_ipv4(another_tree, hf_rtpproxy_command_parameter_local_ipv4, tvb, begin+offset, new_offset, ipaddr[0]); ++ else ++ show_exception(tvb, pinfo, another_tree, DissectorError, "Bogus IPv4"); + offset += new_offset; + break; + case 'r': + new_offset = (gint)strspn(rawstr+offset, "0123456789."); + another_tree = proto_item_add_subtree(ti, ett_rtpproxy_command_parameters_remote); +- proto_tree_add_item(another_tree, hf_rtpproxy_command_parameter_remote, tvb, begin+offset, new_offset, ENC_ASCII | ENC_NA); ++ if(inet_pton(AF_INET, (char*)tvb_get_ephemeral_string(tvb, begin+offset, new_offset), ipaddr)) ++ proto_tree_add_ipv4(another_tree, hf_rtpproxy_command_parameter_remote_ipv4, tvb, begin+offset, new_offset, ipaddr[0]); ++ else ++ show_exception(tvb, pinfo, another_tree, DissectorError, "Bogus IPv4"); + offset += new_offset; + break; + case 'z': +@@ -437,12 +447,13 @@ rtpproxy_add_tid(gboolean is_request, tvbuff_t *tvb, packet_info *pinfo, proto_t + return rtpproxy_info; + } + +-void +-rtpproxy_add_notify_addr(proto_tree *rtpproxy_tree, tvbuff_t *tvb, guint begin, guint end) ++static void ++rtpproxy_add_notify_addr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *rtpproxy_tree, guint begin, guint end) + { + gint offset = 0; + gint tmp = 0; + gboolean ipv6 = FALSE; ++ guint32 ipaddr[4]; /* Enough room for IPv4 or IPv6 */ + proto_item *ti; + + /* Check for at least one colon */ +@@ -454,17 +465,28 @@ rtpproxy_add_notify_addr(proto_tree *rtpproxy_tree, tvbuff_t *tvb, guint begin, + offset = tmp; + } + /* We have ip:port */ +- if(ipv6) +- proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_ipv6, tvb, begin, offset - begin, ENC_ASCII | ENC_NA); +- else +- proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_ipv4, tvb, begin, offset - begin, ENC_ASCII | ENC_NA); ++ if(ipv6){ ++ if(inet_pton(AF_INET6, (char*)tvb_get_ephemeral_string(tvb, begin, offset - begin), ipaddr)) ++ proto_tree_add_ipv6(rtpproxy_tree, hf_rtpproxy_notify_ipv6, tvb, begin, offset - begin, (const guint8 *)ipaddr); ++ else ++ show_exception(tvb, pinfo, rtpproxy_tree, DissectorError, "Bogus IPv6"); ++ } ++ else{ ++ if(inet_pton(AF_INET, (char*)tvb_get_ephemeral_string(tvb, begin, offset - begin), ipaddr)) ++ proto_tree_add_ipv4(rtpproxy_tree, hf_rtpproxy_notify_ipv4, tvb, begin, offset - begin, ipaddr[0]); ++ else ++ show_exception(tvb, pinfo, rtpproxy_tree, DissectorError, "Bogus IPv4"); ++ } + proto_tree_add_uint(rtpproxy_tree, hf_rtpproxy_notify_port, tvb, offset+1, end - (offset+1), + (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, offset+1, end - (offset+1)), NULL, 10)); + } + else{ +- /* Only port is supplied */ +- ti = proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_notify_ipv4, tvb, begin, 0, ENC_ASCII | ENC_NA); +- proto_item_append_text(ti, ""); ++ /* Only port is supplied - take IPv4/IPv6 from ip.src/ipv6.src respectively */ ++ expert_add_info_format(pinfo, rtpproxy_tree, PI_PROTOCOL, PI_WARN, "Only port is supplied - take IPv4/IPv6 from ip.src/ipv6.src respectively"); ++ if (pinfo->src.type == AT_IPv4) ++ ti = proto_tree_add_ipv4(rtpproxy_tree, hf_rtpproxy_notify_ipv4, tvb, begin, 0, ((guint32*)(pinfo->src.data))[0]); ++ else ++ ti = proto_tree_add_ipv6(rtpproxy_tree, hf_rtpproxy_notify_ipv6, tvb, begin, 0, (const guint8 *)(pinfo->src.data)); + PROTO_ITEM_SET_GENERATED(ti); + proto_tree_add_uint(rtpproxy_tree, hf_rtpproxy_notify_port, tvb, begin, end - begin, + (guint16) g_ascii_strtoull((gchar*)tvb_get_ephemeral_string(tvb, begin, end - begin), NULL, 10)); +@@ -490,7 +512,7 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data + /* For RT(C)P setup */ + address addr; + guint16 port; +- guint32 ipaddr[4]; ++ guint32 ipaddr[4]; /* Enough room for IPv4 or IPv6 */ + rtpproxy_info_t *rtpproxy_info = NULL; + + /* If it does not start with a printable character it's not RTPProxy */ +@@ -600,7 +622,7 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data + if (new_offset != offset + 1){ + rtpproxy_tree = proto_item_add_subtree(ti, ett_rtpproxy_command); + ti2 = proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_command_parameters, tvb, offset+1, new_offset - (offset+1), ENC_ASCII | ENC_NA); +- rtpproxy_add_parameter(proto_item_add_subtree(ti2, ett_rtpproxy_command_parameters), tvb, offset+1, new_offset - (offset+1)); ++ rtpproxy_add_parameter(tvb, pinfo, proto_item_add_subtree(ti2, ett_rtpproxy_command_parameters), offset+1, new_offset - (offset+1)); + rtpproxy_tree = proto_item_get_parent(ti); + } + +@@ -623,10 +645,18 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data + if ((tmp == 'u') || (tmp == 'l')){ + /* Extract IP */ + new_offset = tvb_find_guint8(tvb, offset, -1, ' '); +- if (tvb_find_guint8(tvb, offset, new_offset - offset, ':') == -1) +- proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_ipv4, tvb, offset, new_offset - offset, ENC_ASCII | ENC_NA); +- else +- proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_ipv6, tvb, offset, new_offset - offset, ENC_ASCII | ENC_NA); ++ if (tvb_find_guint8(tvb, offset, new_offset - offset, ':') == -1){ ++ if(inet_pton(AF_INET, (char*)tvb_get_ephemeral_string(tvb, offset, new_offset - offset), ipaddr)) ++ proto_tree_add_ipv4(rtpproxy_tree, hf_rtpproxy_ipv4, tvb, offset, new_offset - offset, ipaddr[0]); ++ else ++ show_exception(tvb, pinfo, rtpproxy_tree, DissectorError, "Bogus IPv4"); ++ } ++ else{ ++ if(inet_pton(AF_INET6, (char*)tvb_get_ephemeral_string(tvb, offset, new_offset - offset), ipaddr)) ++ proto_tree_add_ipv6(rtpproxy_tree, hf_rtpproxy_ipv6, tvb, offset, new_offset - offset, (const guint8 *)ipaddr); ++ else ++ show_exception(tvb, pinfo, rtpproxy_tree, DissectorError, "Bogus IPv6"); ++ } + /* Skip whitespace */ + offset = tvb_skip_wsp(tvb, new_offset+1, -1); + +@@ -686,12 +716,12 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data + new_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if(new_offset == -1){ + /* NotifyTag wasn't found (we should re-use Call-ID instead) */ +- rtpproxy_add_notify_addr(rtpproxy_tree, tvb, offset, realsize); ++ rtpproxy_add_notify_addr(tvb, pinfo, rtpproxy_tree, offset, realsize); + break; /* No more parameters */ + } + + /* NotifyTag was found */ +- rtpproxy_add_notify_addr(rtpproxy_tree, tvb, offset, new_offset); ++ rtpproxy_add_notify_addr(tvb, pinfo, rtpproxy_tree, offset, new_offset); + /* Skip whitespace */ + offset = tvb_skip_wsp(tvb, new_offset+1, -1); + +@@ -760,29 +790,38 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data + offset = tvb_skip_wsp(tvb, new_offset+1, -1); + + /* Extract IP */ ++ memset(&addr, 0, sizeof(address)); + tmp = tvb_find_line_end(tvb, offset, -1, &new_offset, FALSE); + if (tvb_find_guint8(tvb, offset, -1, ':') == -1){ +- inet_pton(AF_INET, (char*)tvb_get_ephemeral_string(tvb, offset, tmp), ipaddr); +- addr.type = AT_IPv4; +- addr.len = 4; +- addr.data = ep_memdup(ipaddr, 4); +- proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_ipv4, tvb, offset, tmp, ENC_ASCII | ENC_NA); ++ if (inet_pton(AF_INET, (char*)tvb_get_ephemeral_string(tvb, offset, tmp), ipaddr)){ ++ addr.type = AT_IPv4; ++ addr.len = 4; ++ addr.data = ep_memdup(ipaddr, 4); ++ proto_tree_add_ipv4(rtpproxy_tree, hf_rtpproxy_ipv4, tvb, offset, tmp, ipaddr[0]); ++ } ++ else ++ show_exception(tvb, pinfo, rtpproxy_tree, DissectorError, "Bogus IPv4"); + } + else{ +- inet_pton(AF_INET6, (char*)tvb_get_ephemeral_string(tvb, offset, tmp), ipaddr); +- addr.type = AT_IPv6; +- addr.len = 16; +- addr.data = ep_memdup(ipaddr, 16); +- proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_ipv6, tvb, offset, tmp, ENC_ASCII | ENC_NA); ++ if (inet_pton(AF_INET6, (char*)tvb_get_ephemeral_string(tvb, offset, tmp), ipaddr)){ ++ addr.type = AT_IPv6; ++ addr.len = 16; ++ addr.data = ep_memdup(ipaddr, 16); ++ proto_tree_add_ipv6(rtpproxy_tree, hf_rtpproxy_ipv6, tvb, offset, tmp, (const guint8 *)ipaddr); ++ } ++ else ++ show_exception(tvb, pinfo, rtpproxy_tree, DissectorError, "Bogus IPv6"); + } + + if(rtpproxy_establish_conversation){ + if (rtp_handle) { + /* FIXME tell if isn't a video stream, and setup codec mapping */ +- rtp_add_address(pinfo, &addr, port, 0, "RTPproxy", pinfo->fd->num, 0, NULL); ++ if (addr.len) ++ rtp_add_address(pinfo, &addr, port, 0, "RTPproxy", pinfo->fd->num, 0, NULL); + } + if (rtcp_handle) { +- rtcp_add_address(pinfo, &addr, port+1, 0, "RTPproxy", pinfo->fd->num); ++ if (addr.len) ++ rtcp_add_address(pinfo, &addr, port+1, 0, "RTPproxy", pinfo->fd->num); + } + } + break; +@@ -884,7 +923,7 @@ proto_register_rtpproxy(void) + { + "IPv4", + "rtpproxy.ipv4", +- FT_STRING, ++ FT_IPv4, + BASE_NONE, + NULL, + 0x0, +@@ -897,7 +936,7 @@ proto_register_rtpproxy(void) + { + "IPv6", + "rtpproxy.ipv6", +- FT_STRING, ++ FT_IPv6, + BASE_NONE, + NULL, + 0x0, +@@ -984,11 +1023,11 @@ proto_register_rtpproxy(void) + } + }, + { +- &hf_rtpproxy_command_parameter_local, ++ &hf_rtpproxy_command_parameter_local_ipv4, + { +- "Local IP address", +- "rtpproxy.command_parameter_local", +- FT_STRING, ++ "Local IPv4 address", ++ "rtpproxy.command_parameter_local_ipv4", ++ FT_IPv4, /* FIXME - is it ever possible to see IPv6 here? */ + BASE_NONE, + NULL, + 0x0, +@@ -997,11 +1036,11 @@ proto_register_rtpproxy(void) + } + }, + { +- &hf_rtpproxy_command_parameter_remote, ++ &hf_rtpproxy_command_parameter_remote_ipv4, + { +- "Remote IP address", +- "rtpproxy.command_parameter_remote", +- FT_STRING, ++ "Remote IPv4 address", ++ "rtpproxy.command_parameter_remote_ipv4", ++ FT_IPv4, /* FIXME - is it ever possible to see IPv6 here? */ + BASE_NONE, + NULL, + 0x0, +@@ -1170,7 +1209,7 @@ proto_register_rtpproxy(void) + { + "Notification IPv4", + "rtpproxy.notify_ipv4", +- FT_STRING, ++ FT_IPv4, + BASE_NONE, + NULL, + 0x0, +@@ -1183,7 +1222,7 @@ proto_register_rtpproxy(void) + { + "Notification IPv6", + "rtpproxy.notify_ipv6", +- FT_STRING, ++ FT_IPv6, + BASE_NONE, + NULL, + 0x0, diff --git a/wireshark-0023-Copy-over-r54544-from-trunk.patch b/wireshark-0023-Copy-over-r54544-from-trunk.patch new file mode 100644 index 0000000..6a306e1 --- /dev/null +++ b/wireshark-0023-Copy-over-r54544-from-trunk.patch @@ -0,0 +1,34 @@ +From: Guy Harris +Date: Wed, 1 Jan 2014 23:24:27 +0000 +Subject: [PATCH] Copy over r54544 from trunk: + + ------------------------------------------------------------------------ + r54544 | guy | 2014-01-01 15:22:53 -0800 (Wed, 01 Jan 2014) | 11 lines + + If the uncompression buffers are empty, they have no data; set the count + of bytes in them to 0, as there's no data in them, and set the offset in + that buffer of the stream's current position, to 0, as we're currently + at the beginning of the file in both streams. + + This fixes some tricky-to-reproduce errors (which show up only if the + ngsniffer_t structure is allocated from data that's been allocated, + written to in those variables, and freed). + +svn path=/trunk-1.10/; revision=54545 + +diff --git a/wiretap/ngsniffer.c b/wiretap/ngsniffer.c +index 92e451d..096ee00 100644 +--- a/wiretap/ngsniffer.c ++++ b/wiretap/ngsniffer.c +@@ -740,7 +740,11 @@ ngsniffer_open(wtap *wth, int *err, gchar **err_info) + + /* We haven't allocated any uncompression buffers yet. */ + ngsniffer->seq.buf = NULL; ++ ngsniffer->seq.nbytes = 0; ++ ngsniffer->seq.nextout = 0; + ngsniffer->rand.buf = NULL; ++ ngsniffer->rand.nbytes = 0; ++ ngsniffer->rand.nextout = 0; + + /* Set the current file offset; the offset in the compressed file + and in the uncompressed data stream currently the same. */ diff --git a/wireshark.spec b/wireshark.spec index 22cd672..e073771 100644 --- a/wireshark.spec +++ b/wireshark.spec @@ -21,7 +21,7 @@ Summary: Network traffic analyzer Name: wireshark Version: 1.10.5 -Release: 1%{?dist} +Release: 2%{?dist} License: GPL+ Group: Applications/Internet Source0: http://wireshark.org/download/src/%{name}-%{version}.tar.bz2 @@ -66,9 +66,14 @@ Patch18: wireshark-0018-Copy-over-from-Trunk.patch Patch19: wireshark-0019-Bugfix-port-number-endianness.-Bug-9530-https-bugs.w.patch # No longer necessary - will be removed in the next release (1.12.x) Patch20: wireshark-0020-Something-went-wrong-with-the-backport-of-r53608-r53.patch -# Sent upstream: +# Applied upstream: # https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9576 Patch21: wireshark-0021-Remove-g_memmove.patch +# W.i.p. patch. See also: +# https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9561 +Patch22: wireshark-0022-Fix-IP-types.patch +# Backported from upstream +Patch23: wireshark-0023-Copy-over-r54544-from-trunk.patch Url: http://www.wireshark.org/ BuildRequires: libpcap-devel >= 0.9 @@ -184,6 +189,8 @@ and plugins. #%patch19 -p1 -b .fix_endianness #%patch20 -p1 -b .fix_previous_backport %patch21 -p1 -b .remove_g_memmove +%patch22 -p1 -b .rtpproxy_ip_types +%patch23 -p1 -b .rare_bug_with_sniffer_traces %build %ifarch s390 s390x sparcv9 sparc64 @@ -382,6 +389,10 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %{_datadir}/aclocal/* %changelog +* Mon Jan 13 2014 Peter Lemenkov - 1.10.5-2 +- Updated RTPproxy dissector (again) +- Fix rare issue with the Sniffer traces (patch no. 23) + * Mon Dec 23 2013 Peter Lemenkov - 1.10.5-1 - Ver. 1.10.5 - Don't apply upstreamed patches no. 18, 19, 20.