Skip to content
Snippets Groups Projects
Commit ea941032 authored by Mike Bradeen's avatar Mike Bradeen Committed by Joshua Colp
Browse files

astobj2.c: Fix core when ref_log enabled

In the AO2_ALLOC_OPT_LOCK_NOLOCK case the referenced obj
structure is freed, but is then referenced later if ref_log is
enabled. The change is to store the obj->priv_data.options value
locally and reference it instead of the value from the freed obj

ASTERISK-29730

Change-Id: I60cc5dc1f5a4330e7ad56976fc38a42de0ab6072
parent 3f86c95c
No related branches found
No related tags found
1 merge request!48asterisk uplift to 18.11.2
...@@ -504,6 +504,7 @@ int __ao2_ref(void *user_data, int delta, ...@@ -504,6 +504,7 @@ int __ao2_ref(void *user_data, int delta,
struct astobj2_lockobj *obj_lockobj; struct astobj2_lockobj *obj_lockobj;
int32_t current_value; int32_t current_value;
int32_t ret; int32_t ret;
uint32_t privdataoptions;
struct ao2_weakproxy *weakproxy = NULL; struct ao2_weakproxy *weakproxy = NULL;
const char *lock_state; const char *lock_state;
...@@ -621,6 +622,8 @@ int __ao2_ref(void *user_data, int delta, ...@@ -621,6 +622,8 @@ int __ao2_ref(void *user_data, int delta,
/* In case someone uses an object after it's been freed */ /* In case someone uses an object after it's been freed */
obj->priv_data.magic = 0; obj->priv_data.magic = 0;
/* Save the options locally so the ref_log print at the end doesn't access freed data */
privdataoptions = obj->priv_data.options;
switch (obj->priv_data.options & AO2_ALLOC_OPT_LOCK_MASK) { switch (obj->priv_data.options & AO2_ALLOC_OPT_LOCK_MASK) {
case AO2_ALLOC_OPT_LOCK_MUTEX: case AO2_ALLOC_OPT_LOCK_MUTEX:
...@@ -655,7 +658,7 @@ int __ao2_ref(void *user_data, int delta, ...@@ -655,7 +658,7 @@ int __ao2_ref(void *user_data, int delta,
break; break;
} }
if (ref_log && !(obj->priv_data.options & AO2_ALLOC_OPT_NO_REF_DEBUG)) { if (ref_log && !(privdataoptions & AO2_ALLOC_OPT_NO_REF_DEBUG)) {
fprintf(ref_log, "%p,%d,%d,%s,%d,%s,**destructor**lock-state:%s**,%s\n", fprintf(ref_log, "%p,%d,%d,%s,%d,%s,**destructor**lock-state:%s**,%s\n",
user_data, delta, ast_get_tid(), file, line, func, lock_state, tag ?: ""); user_data, delta, ast_get_tid(), file, line, func, lock_state, tag ?: "");
fflush(ref_log); fflush(ref_log);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment