Skip to content
Snippets Groups Projects
Commit d2c182b6 authored by Diederik de Groot's avatar Diederik de Groot
Browse files

RAII: Change order or variables in clang version

This prevents use-after-scope issues when unwinding the stack,
which happens in reverse order. The varname variable needs to
remain alive for the destruction to be able to access it.
Issue was found using clang + address-sanitizer.

ASTERISK-28232 #close

Change-Id: I00811c34ae910836a5fb6d22304528aef92624db
parent 701cd2ee
Branches
Tags
No related merge requests found
...@@ -786,10 +786,10 @@ char *ast_utils_which(const char *binary, char *fullpath, size_t fullpath_size); ...@@ -786,10 +786,10 @@ char *ast_utils_which(const char *binary, char *fullpath, size_t fullpath_size);
typedef void (^_raii_cleanup_block_t)(void); typedef void (^_raii_cleanup_block_t)(void);
static inline void _raii_cleanup_block(_raii_cleanup_block_t *b) { (*b)(); } static inline void _raii_cleanup_block(_raii_cleanup_block_t *b) { (*b)(); }
#define RAII_VAR(vartype, varname, initval, dtor) \ #define RAII_VAR(vartype, varname, initval, dtor) \
_raii_cleanup_block_t _raii_cleanup_ ## varname __attribute__((cleanup(_raii_cleanup_block),unused)) = NULL; \ __block vartype varname = initval; \
__block vartype varname = initval; \ _raii_cleanup_block_t _raii_cleanup_ ## varname __attribute__((cleanup(_raii_cleanup_block),unused)) = \
_raii_cleanup_ ## varname = ^{ {(void)dtor(varname);} } ^{ {(void)dtor(varname);} };
#elif defined(__GNUC__) #elif defined(__GNUC__)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment