diff --git a/src/modbus.c b/src/modbus.c index 90528cf..4b1fec0 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -2036,53 +2036,67 @@ modbus_mapping_t* modbus_mapping_new(int nb_bits, int nb_input_bits, /* 0X */ mb_mapping->nb_bits = nb_bits; - mb_mapping->tab_bits = - (uint8_t *) malloc(nb_bits * sizeof(uint8_t)); - if (mb_mapping->tab_bits == NULL) { - free(mb_mapping); - return NULL; + if (nb_bits == 0) { + mb_mapping->tab_bits = NULL; + } else { + /* Negative number raises a POSIX error */ + mb_mapping->tab_bits = + (uint8_t *) malloc(nb_bits * sizeof(uint8_t)); + if (mb_mapping->tab_bits == NULL) { + free(mb_mapping); + return NULL; + } + memset(mb_mapping->tab_bits, 0, nb_bits * sizeof(uint8_t)); } - memset(mb_mapping->tab_bits, 0, - nb_bits * sizeof(uint8_t)); /* 1X */ mb_mapping->nb_input_bits = nb_input_bits; - mb_mapping->tab_input_bits = - (uint8_t *) malloc(nb_input_bits * sizeof(uint8_t)); - if (mb_mapping->tab_input_bits == NULL) { - free(mb_mapping); - free(mb_mapping->tab_bits); - return NULL; + if (nb_input_bits == 0) { + mb_mapping->tab_input_bits = NULL; + } else { + mb_mapping->tab_input_bits = + (uint8_t *) malloc(nb_input_bits * sizeof(uint8_t)); + if (mb_mapping->tab_input_bits == NULL) { + free(mb_mapping); + free(mb_mapping->tab_bits); + return NULL; + } + memset(mb_mapping->tab_input_bits, 0, nb_input_bits * sizeof(uint8_t)); } - memset(mb_mapping->tab_input_bits, 0, - nb_input_bits * sizeof(uint8_t)); /* 4X */ mb_mapping->nb_registers = nb_registers; - mb_mapping->tab_registers = - (uint16_t *) malloc(nb_registers * sizeof(uint16_t)); - if (mb_mapping->tab_registers == NULL) { - free(mb_mapping); - free(mb_mapping->tab_bits); - free(mb_mapping->tab_input_bits); - return NULL; + if (nb_registers == 0) { + mb_mapping->tab_registers = NULL; + } else { + mb_mapping->tab_registers = + (uint16_t *) malloc(nb_registers * sizeof(uint16_t)); + if (mb_mapping->tab_registers == NULL) { + free(mb_mapping); + free(mb_mapping->tab_bits); + free(mb_mapping->tab_input_bits); + return NULL; + } + memset(mb_mapping->tab_registers, 0, nb_registers * sizeof(uint16_t)); } - memset(mb_mapping->tab_registers, 0, - nb_registers * sizeof(uint16_t)); /* 3X */ mb_mapping->nb_input_registers = nb_input_registers; - mb_mapping->tab_input_registers = - (uint16_t *) malloc(nb_input_registers * sizeof(uint16_t)); - if (mb_mapping->tab_input_registers == NULL) { - free(mb_mapping); - free(mb_mapping->tab_bits); - free(mb_mapping->tab_input_bits); - free(mb_mapping->tab_registers); - return NULL; + if (nb_input_registers == 0) { + mb_mapping->tab_input_registers = NULL; + } else { + mb_mapping->tab_input_registers = + (uint16_t *) malloc(nb_input_registers * sizeof(uint16_t)); + if (mb_mapping->tab_input_registers == NULL) { + free(mb_mapping); + free(mb_mapping->tab_bits); + free(mb_mapping->tab_input_bits); + free(mb_mapping->tab_registers); + return NULL; + } + memset(mb_mapping->tab_input_registers, 0, + nb_input_registers * sizeof(uint16_t)); } - memset(mb_mapping->tab_input_registers, 0, - nb_input_registers * sizeof(uint16_t)); return mb_mapping; }