Commit e7d499b61a6307ea4046af3915fee73980ec938a

Authored by Stéphane Raimbault
1 parent a0b12254

Allow 0 size in mapping allocation

Idea suggested by Hannu Vuolasaho
Showing 1 changed file with 48 additions and 34 deletions
src/modbus.c
@@ -2036,53 +2036,67 @@ modbus_mapping_t* modbus_mapping_new(int nb_bits, int nb_input_bits, @@ -2036,53 +2036,67 @@ modbus_mapping_t* modbus_mapping_new(int nb_bits, int nb_input_bits,
2036 2036
2037 /* 0X */ 2037 /* 0X */
2038 mb_mapping->nb_bits = nb_bits; 2038 mb_mapping->nb_bits = nb_bits;
2039 - mb_mapping->tab_bits =  
2040 - (uint8_t *) malloc(nb_bits * sizeof(uint8_t));  
2041 - if (mb_mapping->tab_bits == NULL) {  
2042 - free(mb_mapping);  
2043 - return NULL; 2039 + if (nb_bits == 0) {
  2040 + mb_mapping->tab_bits = NULL;
  2041 + } else {
  2042 + /* Negative number raises a POSIX error */
  2043 + mb_mapping->tab_bits =
  2044 + (uint8_t *) malloc(nb_bits * sizeof(uint8_t));
  2045 + if (mb_mapping->tab_bits == NULL) {
  2046 + free(mb_mapping);
  2047 + return NULL;
  2048 + }
  2049 + memset(mb_mapping->tab_bits, 0, nb_bits * sizeof(uint8_t));
2044 } 2050 }
2045 - memset(mb_mapping->tab_bits, 0,  
2046 - nb_bits * sizeof(uint8_t));  
2047 2051
2048 /* 1X */ 2052 /* 1X */
2049 mb_mapping->nb_input_bits = nb_input_bits; 2053 mb_mapping->nb_input_bits = nb_input_bits;
2050 - mb_mapping->tab_input_bits =  
2051 - (uint8_t *) malloc(nb_input_bits * sizeof(uint8_t));  
2052 - if (mb_mapping->tab_input_bits == NULL) {  
2053 - free(mb_mapping);  
2054 - free(mb_mapping->tab_bits);  
2055 - return NULL; 2054 + if (nb_input_bits == 0) {
  2055 + mb_mapping->tab_input_bits = NULL;
  2056 + } else {
  2057 + mb_mapping->tab_input_bits =
  2058 + (uint8_t *) malloc(nb_input_bits * sizeof(uint8_t));
  2059 + if (mb_mapping->tab_input_bits == NULL) {
  2060 + free(mb_mapping);
  2061 + free(mb_mapping->tab_bits);
  2062 + return NULL;
  2063 + }
  2064 + memset(mb_mapping->tab_input_bits, 0, nb_input_bits * sizeof(uint8_t));
2056 } 2065 }
2057 - memset(mb_mapping->tab_input_bits, 0,  
2058 - nb_input_bits * sizeof(uint8_t));  
2059 2066
2060 /* 4X */ 2067 /* 4X */
2061 mb_mapping->nb_registers = nb_registers; 2068 mb_mapping->nb_registers = nb_registers;
2062 - mb_mapping->tab_registers =  
2063 - (uint16_t *) malloc(nb_registers * sizeof(uint16_t));  
2064 - if (mb_mapping->tab_registers == NULL) {  
2065 - free(mb_mapping);  
2066 - free(mb_mapping->tab_bits);  
2067 - free(mb_mapping->tab_input_bits);  
2068 - return NULL; 2069 + if (nb_registers == 0) {
  2070 + mb_mapping->tab_registers = NULL;
  2071 + } else {
  2072 + mb_mapping->tab_registers =
  2073 + (uint16_t *) malloc(nb_registers * sizeof(uint16_t));
  2074 + if (mb_mapping->tab_registers == NULL) {
  2075 + free(mb_mapping);
  2076 + free(mb_mapping->tab_bits);
  2077 + free(mb_mapping->tab_input_bits);
  2078 + return NULL;
  2079 + }
  2080 + memset(mb_mapping->tab_registers, 0, nb_registers * sizeof(uint16_t));
2069 } 2081 }
2070 - memset(mb_mapping->tab_registers, 0,  
2071 - nb_registers * sizeof(uint16_t));  
2072 2082
2073 /* 3X */ 2083 /* 3X */
2074 mb_mapping->nb_input_registers = nb_input_registers; 2084 mb_mapping->nb_input_registers = nb_input_registers;
2075 - mb_mapping->tab_input_registers =  
2076 - (uint16_t *) malloc(nb_input_registers * sizeof(uint16_t));  
2077 - if (mb_mapping->tab_input_registers == NULL) {  
2078 - free(mb_mapping);  
2079 - free(mb_mapping->tab_bits);  
2080 - free(mb_mapping->tab_input_bits);  
2081 - free(mb_mapping->tab_registers);  
2082 - return NULL; 2085 + if (nb_input_registers == 0) {
  2086 + mb_mapping->tab_input_registers = NULL;
  2087 + } else {
  2088 + mb_mapping->tab_input_registers =
  2089 + (uint16_t *) malloc(nb_input_registers * sizeof(uint16_t));
  2090 + if (mb_mapping->tab_input_registers == NULL) {
  2091 + free(mb_mapping);
  2092 + free(mb_mapping->tab_bits);
  2093 + free(mb_mapping->tab_input_bits);
  2094 + free(mb_mapping->tab_registers);
  2095 + return NULL;
  2096 + }
  2097 + memset(mb_mapping->tab_input_registers, 0,
  2098 + nb_input_registers * sizeof(uint16_t));
2083 } 2099 }
2084 - memset(mb_mapping->tab_input_registers, 0,  
2085 - nb_input_registers * sizeof(uint16_t));  
2086 2100
2087 return mb_mapping; 2101 return mb_mapping;
2088 } 2102 }