]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
vector.h: Fix implementation of AST_VECTOR_COMPACT() for empty vectors
authorSean Bright <sean.bright@gmail.com>
Tue, 4 Aug 2020 15:51:16 +0000 (11:51 -0400)
committerJoshua Colp <jcolp@sangoma.com>
Mon, 10 Aug 2020 11:41:02 +0000 (06:41 -0500)
The assumed behavior of realloc() - that it was effectively a free() if
its second argument was 0 - is Linux specific behavior and is not
guaranteed by either POSIX or the C specification.

Instead, if we want to resize a vector to 0, do it explicitly.

Change-Id: Ife31d4b510ebab41cb5477fdc7ea4e3138ca8b4f

include/asterisk/vector.h

index 3f557f02c75ee971e3dd8a3e750be50e662393c4..6f23566ab70bf0dd6899d576a3780593075f233e 100644 (file)
@@ -607,24 +607,28 @@ AST_VECTOR(ast_vector_string, char *);
  * \return 0 on success.
  * \return Non-zero on failure.
  */
-#define AST_VECTOR_COMPACT(vec) ({ \
-       int res = 0;                                                            \
-       do {                                                                                                            \
-               if ((vec)->max > (vec)->current) {                                              \
-                       size_t new_max = (vec)->current;                                \
-                       typeof((vec)->elems) new_elems = ast_realloc(           \
-                               (vec)->elems,                                                                   \
-                               new_max * sizeof(*new_elems));                                  \
-                       if (new_elems || (vec)->current == 0) {                         \
-                               (vec)->elems = new_elems;                                               \
-                               (vec)->max = new_max;                                                   \
-                       } else {                                                                                        \
-                               res = -1;                                                                               \
-                               break;                                                                                  \
-                       }                                                                                                       \
-               }                                                                                                               \
-       } while(0);                                                                                                     \
-       res;                                                                                                            \
+#define AST_VECTOR_COMPACT(vec) ({                                     \
+       int res = 0;                                                    \
+       do {                                                            \
+               size_t new_max = (vec)->current;                        \
+               if (new_max == 0) {                                     \
+                       ast_free((vec)->elems);                         \
+                       (vec)->elems = NULL;                            \
+                       (vec)->max = 0;                                 \
+               } else if ((vec)->max > new_max) {                      \
+                       typeof((vec)->elems) new_elems = ast_realloc(   \
+                               (vec)->elems,                           \
+                               new_max * sizeof(*new_elems));          \
+                       if (new_elems) {                                \
+                               (vec)->elems = new_elems;               \
+                               (vec)->max = new_max;                   \
+                       } else {                                        \
+                               res = -1;                               \
+                               break;                                  \
+                       }                                               \
+               }                                                       \
+       } while(0);                                                     \
+       res;                                                            \
 })
 
 /*!