]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 90145 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Thu, 29 Nov 2007 00:28:10 +0000 (00:28 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 29 Nov 2007 00:28:10 +0000 (00:28 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r90145 | russell | 2007-11-28 18:20:34 -0600 (Wed, 28 Nov 2007) | 5 lines

This set of changes is to make some callerID handling thread-safe.
The ast_set_callerid() function needed to lock the channel.  Also, the handlers
for the CALLERID() dialplan function needed to lock the channel when reading
or writing callerid values directly on the channel structure.

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@90146 65c4cc65-6c06-0410-ace0-fbb531ad65f3

funcs/func_callerid.c
include/asterisk/channel.h
main/channel.c

index e53097f3b43dfac7e1ed355f3ca290f919df8f14..9dfe0d8c7c4dcbf8e823e7de36aaf6dcfaef974b 100644 (file)
@@ -72,6 +72,8 @@ static int callerid_read(struct ast_channel *chan, const char *cmd, char *data,
                        ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
                }
        } else {
+               ast_channel_lock(chan);
+
                if (!strncasecmp("all", data, 3)) {
                        snprintf(buf, len, "\"%s\" <%s>",
                                 S_OR(chan->cid.cid_name, ""),
@@ -105,6 +107,8 @@ static int callerid_read(struct ast_channel *chan, const char *cmd, char *data,
                } else {
                        ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
                }
+
+               ast_channel_unlock(chan);
        }
 
        return 0;
@@ -133,15 +137,17 @@ static int callerid_write(struct ast_channel *chan, const char *cmd, char *data,
                } else
                        ast_set_callerid(chan, NULL, NULL, value);
        } else if (!strncasecmp("dnid", data, 4)) {
-               /* do we need to lock chan here? */
+               ast_channel_lock(chan);
                if (chan->cid.cid_dnid)
                        ast_free(chan->cid.cid_dnid);
                chan->cid.cid_dnid = ast_strdup(value);
+               ast_channel_unlock(chan);
        } else if (!strncasecmp("rdnis", data, 5)) {
-               /* do we need to lock chan here? */
+               ast_channel_lock(chan);
                if (chan->cid.cid_rdnis)
                        ast_free(chan->cid.cid_rdnis);
                chan->cid.cid_rdnis = ast_strdup(value);
+               ast_channel_unlock(chan);
        } else if (!strncasecmp("pres", data, 4)) {
                int i;
                char *s, *val;
index ad4e735b8846ad81b1ef0f9c7e00b1b77255adf4..4bf33d7bd1f8e0c8b428ffb4559ecb1c8a234fc2 100644 (file)
@@ -1309,7 +1309,11 @@ int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen,
 /*! Deactivate an active generator */
 void ast_deactivate_generator(struct ast_channel *chan);
 
-/*! Set caller ID number, name and ANI */
+/*!
+ * \brief Set caller ID number, name and ANI
+ *
+ * \note The channel does not need to be locked before calling this function.
+ */
 void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani);
 
 /*! Set the file descriptor on the channel */
index 0dd937c1e23bea664cc839194e24ab468b300bb4..219485939e6657f9140085e66e42b92e35f3157b 100644 (file)
@@ -3758,6 +3758,8 @@ int ast_do_masquerade(struct ast_channel *original)
 
 void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
 {
+       ast_channel_lock(chan);
+
        if (cid_num) {
                if (chan->cid.cid_num)
                        ast_free(chan->cid.cid_num);
@@ -3788,6 +3790,8 @@ void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char
                                chan->cid.cid_pres,
                                ast_describe_caller_presentation(chan->cid.cid_pres)
                                );
+       
+       ast_channel_unlock(chan);
 }
 
 int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)