Commit e7d499b61a6307ea4046af3915fee73980ec938a
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 | 2036 | |
| 2037 | 2037 | /* 0X */ |
| 2038 | 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 | 2052 | /* 1X */ |
| 2049 | 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 | 2067 | /* 4X */ |
| 2061 | 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 | 2083 | /* 3X */ |
| 2074 | 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 | 2101 | return mb_mapping; |
| 2088 | 2102 | } | ... | ... |