diff --git a/bin/mbus-serial-request-data-multi-reply.c b/bin/mbus-serial-request-data-multi-reply.c index 2213755..d0c06d1 100755 --- a/bin/mbus-serial-request-data-multi-reply.c +++ b/bin/mbus-serial-request-data-multi-reply.c @@ -121,7 +121,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr_str) == 16) + if (mbus_is_secondary_address(addr_str)) { // secondary addressing diff --git a/bin/mbus-serial-request-data.c b/bin/mbus-serial-request-data.c index e4e22e1..74dacf3 100755 --- a/bin/mbus-serial-request-data.c +++ b/bin/mbus-serial-request-data.c @@ -88,7 +88,7 @@ main(int argc, char **argv) } - if (strlen(addr_str) == 16) + if (mbus_is_secondary_address(addr_str)) { // secondary addressing diff --git a/bin/mbus-serial-scan-secondary.c b/bin/mbus-serial-scan-secondary.c index e85355e..b382f4a 100755 --- a/bin/mbus-serial-scan-secondary.c +++ b/bin/mbus-serial-scan-secondary.c @@ -128,7 +128,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr_mask) != 16) + if (mbus_is_secondary_address(addr_mask) == 0) { fprintf(stderr, "Misformatted secondary address mask. Must be 16 character HEX number.\n"); free(addr_mask); diff --git a/bin/mbus-serial-select-secondary.c b/bin/mbus-serial-select-secondary.c index ad4a883..87f5b80 100755 --- a/bin/mbus-serial-select-secondary.c +++ b/bin/mbus-serial-select-secondary.c @@ -49,7 +49,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr) != 16) + if (mbus_is_secondary_address(addr) == 0) { printf("Misformatted secondary address. Must be 16 character HEX number.\n"); return 1; diff --git a/bin/mbus-tcp-raw-send.c b/bin/mbus-tcp-raw-send.c index 8f58b97..7356573 100644 --- a/bin/mbus-tcp-raw-send.c +++ b/bin/mbus-tcp-raw-send.c @@ -90,7 +90,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr_str) == 16) + if (mbus_is_secondary_address(addr_str)) { // secondary addressing int ret; diff --git a/bin/mbus-tcp-request-data-multi-reply.c b/bin/mbus-tcp-request-data-multi-reply.c index e682c1e..2b65c31 100755 --- a/bin/mbus-tcp-request-data-multi-reply.c +++ b/bin/mbus-tcp-request-data-multi-reply.c @@ -81,7 +81,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr_str) == 16) + if (mbus_is_secondary_address(addr_str)) { // secondary addressing diff --git a/bin/mbus-tcp-request-data.c b/bin/mbus-tcp-request-data.c index 70aa4ee..07f72bf 100755 --- a/bin/mbus-tcp-request-data.c +++ b/bin/mbus-tcp-request-data.c @@ -70,7 +70,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr_str) == 16) + if (mbus_is_secondary_address(addr_str)) { // secondary addressing diff --git a/bin/mbus-tcp-scan-secondary.c b/bin/mbus-tcp-scan-secondary.c index 761d86d..42d5565 100755 --- a/bin/mbus-tcp-scan-secondary.c +++ b/bin/mbus-tcp-scan-secondary.c @@ -53,7 +53,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr_mask) != 16) + if (mbus_is_secondary_address(addr_mask) == 0) { fprintf(stderr, "Misformatted secondary address mask. Must be 16 character HEX number.\n"); return 1; diff --git a/bin/mbus-tcp-select-secondary.c b/bin/mbus-tcp-select-secondary.c index e894a97..904bd27 100755 --- a/bin/mbus-tcp-select-secondary.c +++ b/bin/mbus-tcp-select-secondary.c @@ -40,7 +40,7 @@ main(int argc, char **argv) return 1; } - if (strlen(addr) != 16) + if (mbus_is_secondary_address(addr) == 0) { printf("Misformatted secondary address. Must be 16 character HEX number.\n"); return 1; diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index ed6df91..8340cbf 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -1629,6 +1629,12 @@ mbus_send_switch_baudrate_frame(mbus_handle * handle, int address, int baudrate) int control_information = 0; mbus_frame *frame; + if (mbus_is_primary_address(address) == 0) + { + MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); + return -1; + } + switch (baudrate) { case 300: @@ -1690,6 +1696,12 @@ mbus_send_request_frame(mbus_handle * handle, int address) { int retval = 0; mbus_frame *frame; + + if (mbus_is_primary_address(address) == 0) + { + MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); + return -1; + } frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); @@ -1729,6 +1741,12 @@ mbus_sendrecv_request(mbus_handle *handle, int address, mbus_frame *reply, int m MBUS_ERROR("%s: Invalid M-Bus handle for request.\n", __PRETTY_FUNCTION__); return 1; } + + if (mbus_is_primary_address(address) == 0) + { + MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); + return 1; + } frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); @@ -1880,6 +1898,12 @@ mbus_send_ping_frame(mbus_handle *handle, int address, char purge_response) { int retval = 0; mbus_frame *frame; + + if (mbus_is_primary_address(address) == 0) + { + MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, address); + return 1; + } frame = mbus_frame_new(MBUS_FRAME_TYPE_SHORT); diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index 44d56dd..106c217 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -3957,9 +3957,15 @@ mbus_frame_select_secondary_pack(mbus_frame *frame, char *address) int val, i, j, k; char tmp[16]; - if (frame == NULL || address == NULL || strlen(address) != 16) + if (frame == NULL || address == NULL) { - snprintf(error_str, sizeof(error_str), "%s: frame or address arguments are NULL or invalid.", __PRETTY_FUNCTION__); + snprintf(error_str, sizeof(error_str), "%s: frame or address arguments are NULL.", __PRETTY_FUNCTION__); + return -1; + } + + if (mbus_is_secondary_address(address) == 0) + { + snprintf(error_str, sizeof(error_str), "%s: address is invalid.", __PRETTY_FUNCTION__); return -1; } @@ -4011,3 +4017,35 @@ mbus_frame_select_secondary_pack(mbus_frame *frame, char *address) return 0; } + +//--------------------------------------------------------- +// Checks if an integer is a valid primary address. +//--------------------------------------------------------- +int +mbus_is_primary_address(int value) +{ + return ((value >= 0x00) && (value <= 0xFF)); +} + +//--------------------------------------------------------- +// Checks if an string is a valid secondary address. +//--------------------------------------------------------- +int +mbus_is_secondary_address(const char * value) +{ + int i; + + if (value == NULL) + return 0; + + if (strlen(value) != 16) + return 0; + + for (i = 0; i < 16; i++) + { + if (!isxdigit(value[i])) + return 0; + } + + return 1; +} diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h index bd6192f..7eb8ecf 100755 --- a/mbus/mbus-protocol.h +++ b/mbus/mbus-protocol.h @@ -636,6 +636,9 @@ u_char mbus_dif_datalength_lookup(u_char dif); char *mbus_frame_get_secondary_address(mbus_frame *frame); int mbus_frame_select_secondary_pack(mbus_frame *frame, char *address); +int mbus_is_primary_address(int value); +int mbus_is_secondary_address(const char * value); + #ifdef __cplusplus } #endif