Эх сурвалжийг харах

Allow 0 size in mapping allocation

Idea suggested by Hannu Vuolasaho
Stéphane Raimbault 14 жил өмнө
parent
commit
e7d499b61a
1 өөрчлөгдсөн 48 нэмэгдсэн , 34 устгасан
  1. 48 34
      src/modbus.c

+ 48 - 34
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;
 }