summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Bryant <russell@russellbryant.com>2008-10-30 19:28:06 +0000
committerRussell Bryant <russell@russellbryant.com>2008-10-30 19:28:06 +0000
commit694dd34413854cc9704072c62ae63d3d6ce8d812 (patch)
tree95e772cc264473ac062bfbd7e8969fd1241ee175
parentc0b9b259ca1b9121dab8210188a33933a5f9bede (diff)
Fix a bug in AST_SCHED_REPLACE_UNREF(). The reference count of the object
_must_ be increased before creating the scheduler entry. Otherwise, you create a race condition where the reference count may hit zero and the object can disappear out from under you. This could also would have incorrectly decreased the reference count in the case that the scheduler add failed. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@152887 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--include/asterisk/sched.h3
1 files changed, 1 insertions, 2 deletions
diff --git a/include/asterisk/sched.h b/include/asterisk/sched.h
index 92a5d76a4..ab328af95 100644
--- a/include/asterisk/sched.h
+++ b/include/asterisk/sched.h
@@ -113,11 +113,10 @@ extern "C" {
unrefcall; /* should ref _data! */ \
if (_count == 10) \
ast_log(LOG_WARNING, "Unable to cancel schedule ID %d. This is probably a bug (%s: %s, line %d).\n", id, __FILE__, __PRETTY_FUNCTION__, __LINE__); \
+ refcall; \
id = ast_sched_add_variable(sched, when, callback, data, variable); \
if (id == -1) \
addfailcall; \
- else \
- refcall; \
} while (0);
#define AST_SCHED_REPLACE_UNREF(id, sched, when, callback, data, unrefcall, addfailcall, refcall) \