vector: multiple evaluation of elem in AST_VECTOR_ADD_SORTED.

Use temporary variable to prevent multiple evaluations of elem argument.
This resolves a memory leak in res_pjproject startup.

ASTERISK-27317 #close

Change-Id: Ib960d7f5576f9e1a3c478ecb48995582a574e06d
15.6
Corey Farrell 8 years ago
parent ba37dd65d3
commit baf331f4bc

@ -304,27 +304,31 @@ AST_VECTOR(ast_vector_int, int);
* \brief Add an element into a sorted vector * \brief Add an element into a sorted vector
* *
* \param vec Sorted vector to add to. * \param vec Sorted vector to add to.
* \param elem Element to insert. * \param elem Element to insert. Must not be an array type.
* \param cmp A strcmp compatible compare function. * \param cmp A strcmp compatible compare function.
* *
* \return 0 on success. * \return 0 on success.
* \return Non-zero on failure. * \return Non-zero on failure.
* *
* \warning Use of this macro on an unsorted vector will produce unpredictable results * \warning Use of this macro on an unsorted vector will produce unpredictable results
* \warning 'elem' must not be an array type so passing 'x' where 'x' is defined as
* 'char x[4]' will fail to compile. However casting 'x' as 'char *' does
* result in a value that CAN be used.
*/ */
#define AST_VECTOR_ADD_SORTED(vec, elem, cmp) ({ \ #define AST_VECTOR_ADD_SORTED(vec, elem, cmp) ({ \
int res = 0; \ int res = 0; \
size_t __idx = (vec)->current; \ size_t __idx = (vec)->current; \
typeof(elem) __elem = (elem); \
do { \ do { \
if (__make_room((vec)->current, vec) != 0) { \ if (__make_room((vec)->current, vec) != 0) { \
res = -1; \ res = -1; \
break; \ break; \
} \ } \
while (__idx > 0 && (cmp((vec)->elems[__idx - 1], elem) > 0)) { \ while (__idx > 0 && (cmp((vec)->elems[__idx - 1], __elem) > 0)) { \
(vec)->elems[__idx] = (vec)->elems[__idx - 1]; \ (vec)->elems[__idx] = (vec)->elems[__idx - 1]; \
__idx--; \ __idx--; \
} \ } \
(vec)->elems[__idx] = elem; \ (vec)->elems[__idx] = __elem; \
(vec)->current++; \ (vec)->current++; \
} while (0); \ } while (0); \
res; \ res; \

@ -210,7 +210,7 @@ AST_TEST_DEFINE(basic_ops)
ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, ZZZ, strcmp) == 0, rc, cleanup); ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, ZZZ, strcmp) == 0, rc, cleanup);
ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, CCC, strcmp) == 0, rc, cleanup); ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, CCC, strcmp) == 0, rc, cleanup);
ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, AAA, strcmp) == 0, rc, cleanup); ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, AAA, strcmp) == 0, rc, cleanup);
ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, CCC2, strcmp) == 0, rc, cleanup); ast_test_validate_cleanup(test, AST_VECTOR_ADD_SORTED(&sv1, (char*)CCC2, strcmp) == 0, rc, cleanup);
ast_test_validate_cleanup(test, AST_VECTOR_GET(&sv1, 0) == AAA, rc, cleanup); ast_test_validate_cleanup(test, AST_VECTOR_GET(&sv1, 0) == AAA, rc, cleanup);
ast_test_validate_cleanup(test, AST_VECTOR_GET(&sv1, 1) == BBB, rc, cleanup); ast_test_validate_cleanup(test, AST_VECTOR_GET(&sv1, 1) == BBB, rc, cleanup);

Loading…
Cancel
Save