summaryrefslogtreecommitdiff
path: root/funcs/func_cdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'funcs/func_cdr.c')
-rw-r--r--funcs/func_cdr.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/funcs/func_cdr.c b/funcs/func_cdr.c
index 34fdd6736..dc7109659 100644
--- a/funcs/func_cdr.c
+++ b/funcs/func_cdr.c
@@ -197,17 +197,21 @@ static int cdr_read(struct ast_channel *chan, const char *cmd, char *parse,
{
char *ret;
struct ast_flags flags = { 0 };
- struct ast_cdr *cdr = chan ? chan->cdr : NULL;
+ struct ast_cdr *cdr;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(variable);
AST_APP_ARG(options);
);
- if (ast_strlen_zero(parse))
+ if (ast_strlen_zero(parse) || !chan)
return -1;
- if (!cdr)
+ ast_channel_lock(chan);
+ cdr = chan->cdr;
+ if (!cdr) {
+ ast_channel_unlock(chan);
return -1;
+ }
AST_STANDARD_APP_ARGS(args, parse);
@@ -255,13 +259,14 @@ static int cdr_read(struct ast_channel *chan, const char *cmd, char *parse,
ast_test_flag(&flags, OPT_UNPARSED));
}
+ ast_channel_unlock(chan);
return ret ? 0 : -1;
}
static int cdr_write(struct ast_channel *chan, const char *cmd, char *parse,
const char *value)
{
- struct ast_cdr *cdr = chan ? chan->cdr : NULL;
+ struct ast_cdr *cdr;
struct ast_flags flags = { 0 };
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(variable);
@@ -271,8 +276,12 @@ static int cdr_write(struct ast_channel *chan, const char *cmd, char *parse,
if (ast_strlen_zero(parse) || !value || !chan)
return -1;
- if (!cdr)
+ ast_channel_lock(chan);
+ cdr = chan->cdr;
+ if (!cdr) {
+ ast_channel_unlock(chan);
return -1;
+ }
AST_STANDARD_APP_ARGS(args, parse);
@@ -296,6 +305,7 @@ static int cdr_write(struct ast_channel *chan, const char *cmd, char *parse,
/* No need to worry about the u flag, as all fields for which setting
* 'u' would do anything are marked as readonly. */
+ ast_channel_unlock(chan);
return 0;
}