aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Maynard <Christopher.Maynard@GTECH.COM>2012-04-09 18:17:33 +0000
committerChris Maynard <Christopher.Maynard@GTECH.COM>2012-04-09 18:17:33 +0000
commit1e6301fa8b049cf9e9086c034b6550449b2d6402 (patch)
tree14eb0ac1d087cfbb5cd108fb8c0eb37432742aa8
parent9c48f9ca96b1409aa373ee7a8c253b2ce9c196a3 (diff)
Set the minimum length of the Internet Timestamp option to 4 bytes instead of 5. RFC 791 only states that the smallest legal value of the pointer is 5, not the smallest size for the option itself. Fixes https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7043
Since backporting must be manually applied anyway, other changes include fixing the displaying of the EOOL and NOP options, as well as other options without a dissect routine associated with them. svn path=/trunk/; revision=41994
-rw-r--r--epan/dissectors/packet-ip.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/epan/dissectors/packet-ip.c b/epan/dissectors/packet-ip.c
index 61e8543b4a..12467d52f3 100644
--- a/epan/dissectors/packet-ip.c
+++ b/epan/dissectors/packet-ip.c
@@ -183,6 +183,8 @@ static gint ett_ip_dsfield = -1;
static gint ett_ip_tos = -1;
static gint ett_ip_off = -1;
static gint ett_ip_options = -1;
+static gint ett_ip_option_eool = -1;
+static gint ett_ip_option_nop = -1;
static gint ett_ip_option_sec = -1;
static gint ett_ip_option_route = -1;
static gint ett_ip_option_sid = -1;
@@ -190,6 +192,7 @@ static gint ett_ip_option_timestamp = -1;
static gint ett_ip_option_qs = -1;
static gint ett_ip_option_ra = -1;
static gint ett_ip_option_cipso = -1;
+static gint ett_ip_option_other = -1;
static gint ett_ip_fragments = -1;
static gint ett_ip_fragment = -1;
static gint ett_ip_checksum = -1;
@@ -351,7 +354,7 @@ static dissector_handle_t tapa_handle;
/* IP option lengths */
#define IPOLEN_SEC 11
#define IPOLEN_LSR_MIN 3
-#define IPOLEN_TS_MIN 5
+#define IPOLEN_TS_MIN 4
#define IPOLEN_RR_MIN 3
#define IPOLEN_SID 4
#define IPOLEN_SSR_MIN 3
@@ -648,13 +651,20 @@ dissect_ipopt_type(tvbuff_t *tvb, int offset, proto_tree *tree)
}
static void
-dissect_ipopt_eool(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, int offset,
+dissect_ipopt_eool(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
guint optlen _U_, packet_info *pinfo _U_,
proto_tree *opt_tree)
{
- dissect_ipopt_type(tvb, offset, opt_tree);
+ proto_tree *field_tree;
+ proto_item *tf;
+
+ tf = proto_tree_add_text(opt_tree, tvb, offset, 1, "%s", optp->name);
+ field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
+ dissect_ipopt_type(tvb, offset, field_tree);
}
+#define dissect_ipopt_nop dissect_ipopt_eool
+
static void
dissect_ipopt_security(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
guint optlen, packet_info *pinfo, proto_tree *opt_tree)
@@ -1303,8 +1313,8 @@ dissect_ipopt_qs(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
}
static const ip_tcp_opt ipopts[] = {
- {IPOPT_EOOL, "End of Option List (EOL)", NULL, NO_LENGTH, 0, dissect_ipopt_eool},
- {IPOPT_NOP, "No-Operation (NOP)", NULL, NO_LENGTH, 0, dissect_ipopt_eool},
+ {IPOPT_EOOL, "End of Option List (EOL)", &ett_ip_option_eool, NO_LENGTH, 0, dissect_ipopt_eool},
+ {IPOPT_NOP, "No-Operation (NOP)", &ett_ip_option_nop, NO_LENGTH, 0, dissect_ipopt_nop},
{IPOPT_SEC, "Security", &ett_ip_option_sec,
FIXED_LENGTH, IPOLEN_SEC, dissect_ipopt_security},
{IPOPT_SSR, "Strict source route", &ett_ip_option_route,
@@ -1425,10 +1435,15 @@ dissect_ip_tcp_options(tvbuff_t *tvb, int offset, guint length,
optp->name);
(*dissect)(optp, tvb, offset, len, pinfo, opt_tree);
} else {
+ proto_tree *field_tree;
+ proto_item *tf;
+
/* Option has no data, hence no dissector. */
proto_item_append_text(proto_tree_get_parent(opt_tree), ", %s",
name);
- proto_tree_add_text(opt_tree, tvb, offset, len, "%s", name);
+ tf = proto_tree_add_text(opt_tree, tvb, offset, len, "%s", name);
+ field_tree = proto_item_add_subtree(tf, ett_ip_option_other);
+ dissect_ipopt_type(tvb, offset, field_tree);
}
}
len -= 2; /* subtract size of type and length */
@@ -1441,9 +1456,14 @@ dissect_ip_tcp_options(tvbuff_t *tvb, int offset, guint length,
optp->name);
(*dissect)(optp, tvb, offset, 1, pinfo, opt_tree);
} else {
+ proto_tree *field_tree;
+ proto_item *tf;
+
/* Option has no data, hence no dissector. */
proto_item_append_text(proto_tree_get_parent(opt_tree), ", %s", name);
- proto_tree_add_text(opt_tree, tvb, offset, 1, "%s", name);
+ tf = proto_tree_add_text(opt_tree, tvb, offset, 1, "%s", name);
+ field_tree = proto_item_add_subtree(tf, ett_ip_option_other);
+ dissect_ipopt_type(tvb, offset, field_tree);
}
offset += 1;
@@ -2492,6 +2512,8 @@ proto_register_ip(void)
&ett_ip_tos,
&ett_ip_off,
&ett_ip_options,
+ &ett_ip_option_eool,
+ &ett_ip_option_nop,
&ett_ip_option_sec,
&ett_ip_option_route,
&ett_ip_option_sid,
@@ -2499,6 +2521,7 @@ proto_register_ip(void)
&ett_ip_option_qs,
&ett_ip_option_ra,
&ett_ip_option_cipso,
+ &ett_ip_option_other,
&ett_ip_fragments,
&ett_ip_fragment,
&ett_ip_checksum,