TWAMP: Handle short TWAMP-Test packets
authorValentin Vidic <Valentin.Vidic@CARNet.hr>
Mon, 19 Feb 2018 11:10:03 +0000 (12:10 +0100)
committerAnders Broman <a.broman58@gmail.com>
Mon, 19 Feb 2018 15:48:56 +0000 (15:48 +0000)
Requests packets have a minimum length of 14 bytes and only
responses have additional 27 bytes of fields.  Without this
patch short packets generate an exception and get reported
as malformed.

Change-Id: If75fa5556059b13f40fc49273edcbd32508fa0fc
Reviewed-on: https://code.wireshark.org/review/25897
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
epan/dissectors/packet-twamp.c

index cec61bcd4575a2fe38b618f456ebe5ffc8e7f3ce..9497f447ad80e82bf667a45ddd7c79b8856152da 100644 (file)
@@ -553,23 +553,26 @@ dissect_twamp_test(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *da
     proto_tree_add_bitmask(twamp_tree, tvb, offset, hf_twamp_error_estimate, ett_twamp_error_estimate, twamp_error_estimate_flags, ENC_BIG_ENDIAN);
     offset += 2;
 
-    proto_tree_add_item (twamp_tree, hf_twamp_mbz1, tvb, offset, 2, ENC_BIG_ENDIAN);
-    offset += 2;
-    proto_tree_add_item(twamp_tree, hf_twamp_receive_timestamp, tvb, offset, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN);
-    offset += 8;
+    /* Responder sends TWAMP-Test packets with additional fields */
+    if (tvb_reported_length(tvb) - offset >= 27) {
+        proto_tree_add_item (twamp_tree, hf_twamp_mbz1, tvb, offset, 2, ENC_BIG_ENDIAN);
+        offset += 2;
+        proto_tree_add_item(twamp_tree, hf_twamp_receive_timestamp, tvb, offset, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN);
+        offset += 8;
 
-    proto_tree_add_item (twamp_tree, hf_twamp_sender_seq_number, tvb, offset, 4, ENC_BIG_ENDIAN);
-    offset += 4;
+        proto_tree_add_item (twamp_tree, hf_twamp_sender_seq_number, tvb, offset, 4, ENC_BIG_ENDIAN);
+        offset += 4;
 
-    proto_tree_add_item(twamp_tree, hf_twamp_sender_timestamp, tvb, offset, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN);
-    offset += 8;
+        proto_tree_add_item(twamp_tree, hf_twamp_sender_timestamp, tvb, offset, 8, ENC_TIME_NTP | ENC_BIG_ENDIAN);
+        offset += 8;
 
-    proto_tree_add_item (twamp_tree, hf_twamp_sender_error_estimate, tvb, offset, 2, ENC_BIG_ENDIAN);
-    offset += 2;
-    proto_tree_add_item (twamp_tree, hf_twamp_mbz2, tvb, offset, 2, ENC_BIG_ENDIAN);
-    offset += 2;
-    proto_tree_add_item (twamp_tree, hf_twamp_sender_ttl, tvb, offset, 1, ENC_BIG_ENDIAN);
-    offset += 1;
+        proto_tree_add_item (twamp_tree, hf_twamp_sender_error_estimate, tvb, offset, 2, ENC_BIG_ENDIAN);
+        offset += 2;
+        proto_tree_add_item (twamp_tree, hf_twamp_mbz2, tvb, offset, 2, ENC_BIG_ENDIAN);
+        offset += 2;
+        proto_tree_add_item (twamp_tree, hf_twamp_sender_ttl, tvb, offset, 1, ENC_BIG_ENDIAN);
+        offset += 1;
+    }
 
     padding = tvb_reported_length(tvb) - offset;
     if (padding > 0) {