From 99214c1ca891dbadcb896548b8607baa6c51064e Mon Sep 17 00:00:00 2001
From: Pierre Lorinquer <pierre.lorinquer@ssi.gouv.fr>
Date: Thu, 16 Feb 2017 15:02:36 +0100
Subject: [PATCH] NTPControl: rename field 'error' in 'err' in order to have
 the same name for the error field in NTP Control messages and NTP Private
 messages.

Use the XStrFixedLenField class which is now defined in scapy/fields.py + Fix typo.
---
 scapy/layers/ntp.py | 25 +++++--------------------
 test/regression.uts | 32 ++++++++++++++++----------------
 2 files changed, 21 insertions(+), 36 deletions(-)

diff --git a/scapy/layers/ntp.py b/scapy/layers/ntp.py
index 3a679d36..601dc6e4 100644
--- a/scapy/layers/ntp.py
+++ b/scapy/layers/ntp.py
@@ -16,8 +16,8 @@ from scapy.packet import Packet, bind_layers
 from scapy.fields import (BitField, BitEnumField, ByteField, ByteEnumField, \
 XByteField, SignedByteField, FlagsField, ShortField, LEShortField, IntField,\
 LEIntField, FixedPointField, IPField, StrField, StrFixedLenField,\
-StrFixedLenEnumField, PacketField, PacketLenField, PacketListField,\
-FieldListField, ConditionalField, PadField)
+StrFixedLenEnumField, XStrFixedLenField, PacketField, PacketLenField,\
+PacketListField, FieldListField, ConditionalField, PadField)
 from scapy.layers.inet6 import IP6Field
 from scapy.layers.inet import UDP
 from scapy.utils import lhex
@@ -55,28 +55,13 @@ _NTP_HASH_SIZE = 128
 
 class XLEShortField(LEShortField):
     """
-    XLEShortField which value is encoded in little endian.
+    XShortField which value is encoded in little endian.
     """
 
     def i2repr(self, pkt, x):
         return lhex(self.i2h(pkt, x))
 
 
-class XStrFixedLenField(StrFixedLenField):
-    """
-    StrFixedLenField which value is printed as hexadecimal.
-    """
-
-    def i2repr(self, pkt, x):
-        output = ""
-        length = len(x)
-        len_from_val = self.length_from(pkt)
-        max_idx = length if length < len_from_val else len_from_val
-        for i in range(0, max_idx):
-            output += x[i].encode("hex")
-        return output
-
-
 class TimeStampField(FixedPointField):
     """
     This field handles the timestamp fields in the NTP header.
@@ -761,7 +746,7 @@ class NTPControlStatusField(PacketField):
         ret = None
         association_id = struct.unpack("!H", m[2:4])[0]
 
-        if pkt.error == 1:
+        if pkt.err == 1:
             ret = NTPErrorStatusPacket(m)
 
         # op_code == CTL_OP_READSTAT
@@ -869,7 +854,7 @@ class NTPControl(NTP):
         BitField("version", 2, 3),
         BitField("mode", 6, 3),
         BitField("response", 0, 1),
-        BitField("error", 0, 1),
+        BitField("err", 0, 1),
         BitField("more", 0, 1),
         BitEnumField("op_code", 0, 5, _op_codes),
         ShortField("sequence", 0),
diff --git a/test/regression.uts b/test/regression.uts
index 21635a54..b0e48c79 100644
--- a/test/regression.uts
+++ b/test/regression.uts
@@ -5631,7 +5631,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 0)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 1)
 assert(p.sequence == 12)
@@ -5649,7 +5649,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 1)
 assert(p.sequence == 12)
@@ -5695,7 +5695,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 1)
 assert(p.op_code == 2)
 assert(p.sequence == 18)
@@ -5720,7 +5720,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 2)
 assert(p.sequence == 18)
@@ -5738,7 +5738,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 0)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 2)
 assert(len(p.data.load) == 12)
@@ -5753,7 +5753,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 1)
+assert(p.err == 1)
 assert(p.more == 0)
 assert(p.op_code == 2)
 assert(len(p.data.load) == 0)
@@ -5768,7 +5768,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 0)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 3)
 assert(len(p.data.load) == 12)
@@ -5783,7 +5783,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 1)
+assert(p.err == 1)
 assert(p.more == 0)
 assert(p.op_code == 3)
 assert(hasattr(p, 'status_word'))
@@ -5801,7 +5801,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 0)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 8)
 assert(p.count == 12)
@@ -5817,7 +5817,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 8)
 assert(p.count == 18)
@@ -5833,7 +5833,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 0)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 9)
 assert(p.count == 15)
@@ -5849,7 +5849,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 9)
 assert(p.count == 42)
@@ -5865,7 +5865,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 0)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 12)
 assert(p.data == '')
@@ -5879,7 +5879,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.more == 0)
 assert(p.op_code == 12)
 assert(p.data.load == 'nonce=db4186a2e1d9022472e24bc9\r\n')
@@ -5893,7 +5893,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 0)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.op_code == 10)
 assert(p.count == 40)
 assert(p.data.load == 'nonce=db4186a2e1d9022472e24bc9, frags=32')
@@ -5906,7 +5906,7 @@ assert(isinstance(p, NTPControl))
 assert(p.version == 2)
 assert(p.mode == 6)
 assert(p.response == 1)
-assert(p.error == 0)
+assert(p.err == 0)
 assert(p.op_code == 10)
 assert(p.count == 233)
 assert(p.data.load == 'nonce=db4186a2e2073198b93c6419, addr.0=192.168.122.100:123,\r\nfirst.0=0xdb418673.323e1a89, last.0=0xdb418673.323e1a89, ct.0=1,\r\nmv.0=36, rs.0=0x0, WWQ.0=18446744073709509383, now=0xdb4186a2.e20ff8f4,\r\nlast.newest=0xdb418673.323e1a89\r\n\x00\x00\x00')
-- 
GitLab