From c459d7b8ffba5801e195a2d2641dab5edcfd02a2 Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Fri, 23 Jun 2023 15:51:56 +0200 Subject: [PATCH] fix(inputs.modbus): Check number of register for datatype (#13485) --- .../inputs/modbus/configuration_register.go | 20 ++++++++++++++++++- .../init.err | 1 + .../telegraf.conf | 9 +++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/init.err create mode 100644 plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/telegraf.conf diff --git a/plugins/inputs/modbus/configuration_register.go b/plugins/inputs/modbus/configuration_register.go index d48c8b869e4cf..3eb0f13d45197 100644 --- a/plugins/inputs/modbus/configuration_register.go +++ b/plugins/inputs/modbus/configuration_register.go @@ -224,12 +224,30 @@ func (c *ConfigurationOriginal) validateFieldDefinitions(fieldDefs []fieldDefini return fmt.Errorf("invalid byte order %q and address '%v' in %q - %q", item.ByteOrder, item.Address, registerType, item.Name) } + // Check for the request size corresponding to the data-type + var requiredAddresses int + switch item.DataType { + case "INT8L", "INT8H", "UINT8L", "UINT8H", "UINT16", "INT16", "FLOAT16-IEEE": + requiredAddresses = 1 + case "UINT32", "INT32", "FLOAT32-IEEE": + requiredAddresses = 2 + + case "UINT64", "INT64", "FLOAT64-IEEE": + requiredAddresses = 4 + } + if requiredAddresses > 0 && len(item.Address) != requiredAddresses { + return fmt.Errorf( + "invalid address '%v' length '%v'in %q - %q, expecting %d entries for datatype", + item.Address, len(item.Address), registerType, item.Name, requiredAddresses, + ) + } + // search duplicated if len(item.Address) > len(removeDuplicates(item.Address)) { return fmt.Errorf("duplicate address '%v' in %q - %q", item.Address, registerType, item.Name) } } else if len(item.Address) != 1 { - return fmt.Errorf("invalid address'%v' length'%v' in %q - %q", item.Address, len(item.Address), registerType, item.Name) + return fmt.Errorf("invalid address '%v' length '%v'in %q - %q", item.Address, len(item.Address), registerType, item.Name) } } return nil diff --git a/plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/init.err b/plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/init.err new file mode 100644 index 0000000000000..19956cfc2e161 --- /dev/null +++ b/plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/init.err @@ -0,0 +1 @@ +invalid address \ No newline at end of file diff --git a/plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/telegraf.conf b/plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/telegraf.conf new file mode 100644 index 0000000000000..55a266fa7299a --- /dev/null +++ b/plugins/inputs/modbus/testcases/field_request_too_short_issue_13482/telegraf.conf @@ -0,0 +1,9 @@ +[[inputs.modbus]] + name = "Device" + slave_id = 1 + timeout = "1s" + controller = "tcp://localhost:502" + + holding_registers = [ + { name = "data", byte_order = "DCBA", data_type = "UINT64", scale=0.01, address = [0, 1]} + ]