From 739f92eddf418383218a8eb7cc0d1ec74742db20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Fri, 4 Jun 2021 11:23:33 +0200 Subject: [PATCH 1/9] An additional check since the length of the PgnList[i].FieldList looks to change throughout the loop. To avoid runtime errors then this seems to work. --- nmea2k/raw_message.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nmea2k/raw_message.go b/nmea2k/raw_message.go index 8145a7f..9184e60 100644 --- a/nmea2k/raw_message.go +++ b/nmea2k/raw_message.go @@ -157,6 +157,11 @@ func ParsePacket(cmsg *can.RawMessage) (pgnParsed *ParsedMessage) { i++ pgnDefinition = PgnList[i] fields = pgnDefinition.FieldList + + if idx >= len(fields) { + break + } + field = fields[idx] } } else { From f50ce07e48de2492ee7ff1c733f13eead2468c6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Thu, 19 Aug 2021 14:07:16 +0200 Subject: [PATCH 2/9] New bugfix to ensure that we don't go beyond the length of PgnList --- nmea2k/raw_message.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/nmea2k/raw_message.go b/nmea2k/raw_message.go index 9184e60..416adf4 100644 --- a/nmea2k/raw_message.go +++ b/nmea2k/raw_message.go @@ -155,14 +155,19 @@ func ParsePacket(cmsg *can.RawMessage) (pgnParsed *ParsedMessage) { break } else { i++ - pgnDefinition = PgnList[i] - fields = pgnDefinition.FieldList + pgnListLen := len(PgnList) + if i < pgnListLen { + pgnDefinition = PgnList[i] + fields = pgnDefinition.FieldList - if idx >= len(fields) { + if idx >= len(fields) { + break + } + + field = fields[idx] + } else { break } - - field = fields[idx] } } else { break From 79d37510d458267dbbbb4c1d476194932fcc21cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Tue, 14 Sep 2021 10:41:49 +0200 Subject: [PATCH 3/9] Changed to asbjorn for internal binary to work --- go.mod | 2 +- go.sum | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 46eb856..1c5ac9c 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/timmathews/argo +module github.com/asbjorn/argo go 1.13 diff --git a/go.sum b/go.sum index 29c36da..50ef333 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,6 @@ github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 h1:J1QZwDXgZ4dJD2s19 github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/satori/go.uuid v1.1.0 h1:B9KXyj+GzIpJbV7gmr873NsY6zpbxNy24CBtGrk7jHo= github.com/satori/go.uuid v1.1.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/timmathews/argo v0.0.0-20181009003531-03c44b3fef04 h1:EkKkR9E53qyarD/+E9l/Q2vht9JSg3Q+cAxOvjB53JA= -github.com/timmathews/argo v0.0.0-20181009003531-03c44b3fef04/go.mod h1:iG3KBDcgVX5zqC11ks5tSORdW2gCXROP5S2crUH4J18= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlVjOeLOBz+CPAI8dnbqNSVwUwRrkp7vQ= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= golang.org/x/net v0.0.0-20161229225711-8fd7f2595553 h1:R1raIZjpvFR0iw8sqwNeyRumKrHFoend3L2d5xbadFI= From c9694a062b6edbbb90026a73a9a99fb90ccee060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Fri, 18 Feb 2022 10:34:52 +0100 Subject: [PATCH 4/9] Ran go mod tidy --- go.mod | 15 ++++++--------- go.sum | 2 ++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 1c5ac9c..0448636 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,22 @@ module github.com/asbjorn/argo -go 1.13 +// module github.com/timmathews/argo + +go 1.15 require ( github.com/burntsushi/toml v0.2.0 github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645 github.com/eclipse/paho.mqtt.golang v1.1.0 - github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b // indirect - github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/mux v1.4.0 github.com/gorilla/websocket v1.2.0 github.com/imdario/mergo v0.0.0-20160216103600-3e95a51e0639 github.com/jacobsa/go-serial v0.0.0-20160401030210-6f298b3ae27e - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 github.com/satori/go.uuid v1.1.0 + github.com/timmathews/argo v0.0.0-00010101000000-000000000000 github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 - golang.org/x/net v0.0.0-20161229225711-8fd7f2595553 // indirect - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect - google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0 // indirect - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/vmihailenco/msgpack.v2 v2.9.1 - gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 // indirect ) + +replace github.com/timmathews/argo => github.com/asbjorn/argo v1.1.1 diff --git a/go.sum b/go.sum index 50ef333..f76ce29 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/asbjorn/argo v1.1.1 h1:2Qo4H2a5L6LaagYqDwlVdXM5CFBIN7H6a4q+DR4WTiI= +github.com/asbjorn/argo v1.1.1/go.mod h1:qWySId9q7OxWDy3cJv7Vlq1DokE5L3uyjz5WN7NAnks= github.com/burntsushi/toml v0.2.0 h1:1dV0laB43OdzcmNxn0Us4ZYueQUcpxxlMJ0NF0MPJhQ= github.com/burntsushi/toml v0.2.0/go.mod h1:tCq67G3LEDB9hykA6+KWl2FPEy0nPcvE8TTBhtOtdGs= github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645 h1:P2qhNT0y1A7XeBvSwkvXV2nZTd28Ax5n709pred+3Ys= From 902f4fc65fbaaa4997710a08b0241ddb5e7eb339 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Fri, 18 Feb 2022 10:35:26 +0100 Subject: [PATCH 5/9] New testcase which triggers when incorrect extractNumber for NMEA data occurs. --- nmea2k/raw_message_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/nmea2k/raw_message_test.go b/nmea2k/raw_message_test.go index 79f8281..73b9ec5 100644 --- a/nmea2k/raw_message_test.go +++ b/nmea2k/raw_message_test.go @@ -211,3 +211,26 @@ func TestExtractNumber(t *testing.T) { } } } + +func TestPgn127489NumberExtraction(t *testing.T) { + var msg = RawMessage{new(can.RawMessage)} + msg.Data = []byte{0x00, 0xe8, 0x08, 0xff, 0xff, 0x73, 0x7d, 0x31, 0x0b, 0x0c, 0x00, 0x80, 0x99, 0x56, 0x04, 0xff, 0xff, 0x60, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03} + msg.Pgn = uint32(127489) + + pgnParsed := ParsePacket(msg.RawMessage) + _, ok := pgnParsed.Data[6].(uint64) + if !ok { + t.Errorf("unable to extract 'total engine hours' from valid RawMessage: %+v\n", pgnParsed.Data[6]) + } + + // This RawMessage is the 'BAD' one with invalid values. Field 6 should be 'nil' with the proper validation. + msg = RawMessage{new(can.RawMessage)} + msg.Data = []byte{0x00, 0xe8, 0x08, 0xff, 0xff, 0x73, 0x7d, 0x31, 0x0b, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x04} + msg.Pgn = uint32(127489) + + pgnParsed = ParsePacket(msg.RawMessage) + engineHours, ok := pgnParsed.Data[6].(uint64) + if ok { + t.Errorf("the value for the field 'total engine hours' is invalid: (%d). Need to check maximum value during extraction. RawMessage: %+v\n", engineHours, pgnParsed.Data[6]) + } +} From c4cc27862b6e714c775fe02b6ae55042fce7ae6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Fri, 18 Feb 2022 10:35:50 +0100 Subject: [PATCH 6/9] Included a commented code block to check and validate the extracted number. If value is too large (overflowed) the function `func (msg *RawMessage) extractNumber(..)` returns an error and the value will be set to nil. --- nmea2k/raw_message.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/nmea2k/raw_message.go b/nmea2k/raw_message.go index 53017c2..87e0b67 100644 --- a/nmea2k/raw_message.go +++ b/nmea2k/raw_message.go @@ -450,23 +450,23 @@ func (msg *RawMessage) extractNumber(field *Field, start, end, offset, width uin return } - // var maxValue uint64 - // if width > 8 { - // maxValue = 1<<(width-1) - 1 - // } else if width == 1 { - // maxValue = 1 - // } else { - // maxValue = 1< maxValue { - // e = &DecodeError{data, "Field not present"} - // return - // } + var maxValue uint64 + if width > 8 { + maxValue = 1<<(width-1) - 1 + } else if width == 1 { + maxValue = 1 + } else { + maxValue = 1< maxValue { + e = &DecodeError{data, "Field not present"} + return + } if res != 1 && res != RES_LOOKUP && res != RES_MANUFACTURER && res != RES_INTEGER { if field.Signed { From a85dccd7af989111b8c36245e6d1a900b2f93969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Fri, 18 Feb 2022 11:09:24 +0100 Subject: [PATCH 7/9] Updated version and some dependencies --- go.mod | 3 ++- go.sum | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 0448636..da894db 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,8 @@ require ( github.com/satori/go.uuid v1.1.0 github.com/timmathews/argo v0.0.0-00010101000000-000000000000 github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect gopkg.in/vmihailenco/msgpack.v2 v2.9.1 ) -replace github.com/timmathews/argo => github.com/asbjorn/argo v1.1.1 +replace github.com/timmathews/argo => github.com/asbjorn/argo v1.1.2-rc1 diff --git a/go.sum b/go.sum index f76ce29..203ca10 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/asbjorn/argo v1.1.1 h1:2Qo4H2a5L6LaagYqDwlVdXM5CFBIN7H6a4q+DR4WTiI= github.com/asbjorn/argo v1.1.1/go.mod h1:qWySId9q7OxWDy3cJv7Vlq1DokE5L3uyjz5WN7NAnks= +github.com/asbjorn/argo v1.1.2-rc1 h1:gP9SpfPAx2M+j4b4um3IzIgvoqBEjUnYhjY3Ii98mHM= +github.com/asbjorn/argo v1.1.2-rc1/go.mod h1:dpLjcvPN06njOGkbdcqanHfJ6+slulRhZPnAXDtDJr8= github.com/burntsushi/toml v0.2.0 h1:1dV0laB43OdzcmNxn0Us4ZYueQUcpxxlMJ0NF0MPJhQ= github.com/burntsushi/toml v0.2.0/go.mod h1:tCq67G3LEDB9hykA6+KWl2FPEy0nPcvE8TTBhtOtdGs= github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645 h1:P2qhNT0y1A7XeBvSwkvXV2nZTd28Ax5n709pred+3Ys= @@ -31,8 +33,15 @@ github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlV github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= golang.org/x/net v0.0.0-20161229225711-8fd7f2595553 h1:R1raIZjpvFR0iw8sqwNeyRumKrHFoend3L2d5xbadFI= golang.org/x/net v0.0.0-20161229225711-8fd7f2595553/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0 h1:rYf3ZsXcmuxMqvit5i+rfstUzjzWLHe5cFsNXF+2IIA= google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= From a98563310733f626346d6090b4a2c691c5a0c86d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Fri, 18 Feb 2022 15:03:12 +0100 Subject: [PATCH 8/9] Updated go modules dependencies --- go.mod | 11 ++++++----- go.sum | 29 +++++++++++++---------------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index da894db..7cafdad 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ -module github.com/asbjorn/argo +module github.com/timmathews/argo -// module github.com/timmathews/argo +// module github.com/asbjorn/argo go 1.15 @@ -8,16 +8,17 @@ require ( github.com/burntsushi/toml v0.2.0 github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645 github.com/eclipse/paho.mqtt.golang v1.1.0 + github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/mux v1.4.0 github.com/gorilla/websocket v1.2.0 github.com/imdario/mergo v0.0.0-20160216103600-3e95a51e0639 github.com/jacobsa/go-serial v0.0.0-20160401030210-6f298b3ae27e github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 github.com/satori/go.uuid v1.1.0 - github.com/timmathews/argo v0.0.0-00010101000000-000000000000 github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect + google.golang.org/appengine v1.6.7 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/vmihailenco/msgpack.v2 v2.9.1 + gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 // indirect ) - -replace github.com/timmathews/argo => github.com/asbjorn/argo v1.1.2-rc1 diff --git a/go.sum b/go.sum index 203ca10..40a2b67 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,11 @@ -github.com/asbjorn/argo v1.1.1 h1:2Qo4H2a5L6LaagYqDwlVdXM5CFBIN7H6a4q+DR4WTiI= -github.com/asbjorn/argo v1.1.1/go.mod h1:qWySId9q7OxWDy3cJv7Vlq1DokE5L3uyjz5WN7NAnks= -github.com/asbjorn/argo v1.1.2-rc1 h1:gP9SpfPAx2M+j4b4um3IzIgvoqBEjUnYhjY3Ii98mHM= -github.com/asbjorn/argo v1.1.2-rc1/go.mod h1:dpLjcvPN06njOGkbdcqanHfJ6+slulRhZPnAXDtDJr8= github.com/burntsushi/toml v0.2.0 h1:1dV0laB43OdzcmNxn0Us4ZYueQUcpxxlMJ0NF0MPJhQ= github.com/burntsushi/toml v0.2.0/go.mod h1:tCq67G3LEDB9hykA6+KWl2FPEy0nPcvE8TTBhtOtdGs= github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645 h1:P2qhNT0y1A7XeBvSwkvXV2nZTd28Ax5n709pred+3Ys= github.com/deckarep/golang-set v0.0.0-20170202203032-fc8930a5e645/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/eclipse/paho.mqtt.golang v1.1.0 h1:Em29HD1CwLHdRFnX7yfg+kBjHHw6DSDok9I+ia4znT4= github.com/eclipse/paho.mqtt.golang v1.1.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b h1:fE/yi9pibxGEc0gSJuEShcsBXE2d5FW3OudsjE9tKzQ= -github.com/golang/protobuf v0.0.0-20161117033126-8ee79997227b/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.4.0 h1:N6R8isjoRv7IcVVlf0cTBbo0UDc9V6ZXWEm0HQoQmLo= @@ -20,32 +16,33 @@ github.com/imdario/mergo v0.0.0-20160216103600-3e95a51e0639 h1:VMd01CgpBpmLpuERy github.com/imdario/mergo v0.0.0-20160216103600-3e95a51e0639/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jacobsa/go-serial v0.0.0-20160401030210-6f298b3ae27e h1:qq9z2iYia+KDwHsFAdN8mjVQ1zY/YJLqdC0xG9lDUXU= github.com/jacobsa/go-serial v0.0.0-20160401030210-6f298b3ae27e/go.mod h1:2RvX5ZjVtsznNZPEt4xwJXNJrM3VTZoQf7V6gk0ysvs= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 h1:J1QZwDXgZ4dJD2s19iqR9+U00OWM2kDzbf1O/fmvCWg= github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/satori/go.uuid v1.1.0 h1:B9KXyj+GzIpJbV7gmr873NsY6zpbxNy24CBtGrk7jHo= github.com/satori/go.uuid v1.1.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlVjOeLOBz+CPAI8dnbqNSVwUwRrkp7vQ= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= -golang.org/x/net v0.0.0-20161229225711-8fd7f2595553 h1:R1raIZjpvFR0iw8sqwNeyRumKrHFoend3L2d5xbadFI= -golang.org/x/net v0.0.0-20161229225711-8fd7f2595553/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0 h1:rYf3ZsXcmuxMqvit5i+rfstUzjzWLHe5cFsNXF+2IIA= -google.golang.org/appengine v1.0.1-0.20161217034650-08a149cfaee0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/vmihailenco/msgpack.v2 v2.9.1 h1:kb0VV7NuIojvRfzwslQeP3yArBqJHW9tOl4t38VS1jM= gopkg.in/vmihailenco/msgpack.v2 v2.9.1/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU= From 2bce74b0e1874eb82db7030d1d2674fb2b08ee3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Alexander=20Fellinghaug?= Date: Mon, 21 Feb 2022 11:54:19 +0100 Subject: [PATCH 9/9] Fixes #9 by introducing max value checking as done in github.com/canboat/canboat --- nmea2k/raw_message.go | 11 ++++++++++- nmea2k/raw_message_test.go | 11 +++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/nmea2k/raw_message.go b/nmea2k/raw_message.go index 87e0b67..5c88bc3 100644 --- a/nmea2k/raw_message.go +++ b/nmea2k/raw_message.go @@ -463,7 +463,16 @@ func (msg *RawMessage) extractNumber(field *Field, start, end, offset, width uin maxValue = 0x7FFFFFFFFFFFFFFF } - if num > maxValue { + var reserved uint64 + if maxValue >= 15 { + reserved = 2 + } else if maxValue > 1 { + reserved = 1 + } else { + reserved = 0 + } + + if num > maxValue-reserved { e = &DecodeError{data, "Field not present"} return } diff --git a/nmea2k/raw_message_test.go b/nmea2k/raw_message_test.go index 73b9ec5..cf6ad81 100644 --- a/nmea2k/raw_message_test.go +++ b/nmea2k/raw_message_test.go @@ -233,4 +233,15 @@ func TestPgn127489NumberExtraction(t *testing.T) { if ok { t.Errorf("the value for the field 'total engine hours' is invalid: (%d). Need to check maximum value during extraction. RawMessage: %+v\n", engineHours, pgnParsed.Data[6]) } + + // This RawMessage is the 'BAD' one with invalid values. Field 6 should be 'nil' with the proper validation. + msg = RawMessage{new(can.RawMessage)} + msg.Data = []byte{0x00, 0xb0, 0x09, 0xff, 0xff, 0xab, 0x7c, 0xff, 0x7f, 0x15, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x02, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x05} + msg.Pgn = uint32(127489) + + pgnParsed = ParsePacket(msg.RawMessage) + alternator, ok := pgnParsed.Data[4].(float64) + if ok { + t.Errorf("the value for the field 'alternator_potential' is invalid: (%f). Need to check maximum value during extraction. RawMessage: %+v\n", alternator, pgnParsed.Data[4]) + } }