]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
RAII: Change order or variables in clang version
authorDiederik de Groot <dkgroot@talon.nl>
Sat, 5 Jan 2019 17:14:26 +0000 (18:14 +0100)
committerDiederik de Groot <dkgroot@talon.nl>
Wed, 9 Jan 2019 01:34:27 +0000 (20:34 -0500)
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

include/asterisk/utils.h

index c0cce98ae232203c5f953227667e1833d6ebf0d8..4dc406db7ff0df7d3fc5c7a162f9d82d4a05005b 100644 (file)
@@ -786,10 +786,10 @@ char *ast_utils_which(const char *binary, char *fullpath, size_t fullpath_size);
 typedef void (^_raii_cleanup_block_t)(void);
 static inline void _raii_cleanup_block(_raii_cleanup_block_t *b) { (*b)(); }
 
-#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;                                                                           \
-    _raii_cleanup_ ## varname = ^{ {(void)dtor(varname);} }
+#define RAII_VAR(vartype, varname, initval, dtor)                                                              \
+    __block vartype varname = initval;                                                                         \
+    _raii_cleanup_block_t _raii_cleanup_ ## varname __attribute__((cleanup(_raii_cleanup_block),unused)) =     \
+        ^{ {(void)dtor(varname);} };
 
 #elif defined(__GNUC__)