Author: rmudgett
Date: Fri Sep  5 15:35:37 2014
New Revision: 422700

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=422700
Log:
func_channel.c: Add missing locking to some CHANNEL() requests.

* The CHANNEL() audionativeformat, videonativeformat, audioreadformat, and
audiowriteformat now need locking since the media format rework when
accessing the channel's format pointers.

* Increased the buffer size for CHANNEL() audionativeformat and
videonativeformat output strings since the allow=all can be a lengthy
list.

* Tweaked the CHANNEL() XML documentation for secure_bridge_signaling,
secure_bridge_media, and state.

* Ensured the output buffer is initialized for secure_bridge_signaling and
secure_bridge_media.

* Made use the locked_copy_string() macro instead of inlining it for trace
and checkhangup.

Modified:
    branches/13/funcs/func_channel.c

Modified: branches/13/funcs/func_channel.c
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/funcs/func_channel.c?view=diff&rev=422700&r1=422699&r2=422700
==============================================================================
--- branches/13/funcs/func_channel.c (original)
+++ branches/13/funcs/func_channel.c Fri Sep  5 15:35:37 2014
@@ -172,13 +172,13 @@
                                                <para>R/W set rxgain level on 
channel drivers that support it.</para>
                                        </enum>
                                        <enum name="secure_bridge_signaling">
-                                               <para>Whether or not channels 
bridged to this channel require secure signaling</para>
+                                               <para>Whether or not channels 
bridged to this channel require secure signaling (1/0)</para>
                                        </enum>
                                        <enum name="secure_bridge_media">
-                                               <para>Whether or not channels 
bridged to this channel require secure media</para>
+                                               <para>Whether or not channels 
bridged to this channel require secure media (1/0)</para>
                                        </enum>
                                        <enum name="state">
-                                               <para>R/O state for 
channel</para>
+                                               <para>R/O state of the 
channel</para>
                                        </enum>
                                        <enum name="tonezone">
                                                <para>R/W zone for indications 
played</para>
@@ -432,30 +432,32 @@
        if (!strcasecmp(data, "audionativeformat")) {
                tmpcap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
                if (tmpcap) {
-                       struct ast_str *codec_buf = ast_str_alloca(64);
-
+                       struct ast_str *codec_buf = ast_str_alloca(128);
+
+                       ast_channel_lock(chan);
                        ast_format_cap_append_from_cap(tmpcap, 
ast_channel_nativeformats(chan), AST_MEDIA_TYPE_AUDIO);
+                       ast_channel_unlock(chan);
                        ast_copy_string(buf, ast_format_cap_get_names(tmpcap, 
&codec_buf), len);
                        ao2_ref(tmpcap, -1);
                }
        } else if (!strcasecmp(data, "videonativeformat")) {
                tmpcap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
                if (tmpcap) {
-                       struct ast_str *codec_buf = ast_str_alloca(64);
-
+                       struct ast_str *codec_buf = ast_str_alloca(128);
+
+                       ast_channel_lock(chan);
                        ast_format_cap_append_from_cap(tmpcap, 
ast_channel_nativeformats(chan), AST_MEDIA_TYPE_VIDEO);
+                       ast_channel_unlock(chan);
                        ast_copy_string(buf, ast_format_cap_get_names(tmpcap, 
&codec_buf), len);
                        ao2_ref(tmpcap, -1);
                }
        } else if (!strcasecmp(data, "audioreadformat")) {
-               ast_copy_string(buf, 
ast_format_get_name(ast_channel_readformat(chan)), len);
+               locked_copy_string(chan, buf, 
ast_format_get_name(ast_channel_readformat(chan)), len);
        } else if (!strcasecmp(data, "audiowriteformat")) {
-               ast_copy_string(buf, 
ast_format_get_name(ast_channel_writeformat(chan)), len);
+               locked_copy_string(chan, buf, 
ast_format_get_name(ast_channel_writeformat(chan)), len);
 #ifdef CHANNEL_TRACE
        } else if (!strcasecmp(data, "trace")) {
-               ast_channel_lock(chan);
-               ast_copy_string(buf, ast_channel_trace_is_enabled(chan) ? "1" : 
"0", len);
-               ast_channel_unlock(chan);
+               locked_copy_string(chan, buf, 
ast_channel_trace_is_enabled(chan) ? "1" : "0", len);
 #endif
        } else if (!strcasecmp(data, "tonezone") && ast_channel_zone(chan)) {
                locked_copy_string(chan, buf, ast_channel_zone(chan)->country, 
len);
@@ -478,9 +480,7 @@
        else if (!strcasecmp(data, "accountcode"))
                locked_copy_string(chan, buf, ast_channel_accountcode(chan), 
len);
        else if (!strcasecmp(data, "checkhangup")) {
-               ast_channel_lock(chan);
-               ast_copy_string(buf, ast_check_hangup(chan) ? "1" : "0", len);
-               ast_channel_unlock(chan);
+               locked_copy_string(chan, buf, ast_check_hangup(chan) ? "1" : 
"0", len);
        } else if (!strcasecmp(data, "peeraccount"))
                locked_copy_string(chan, buf, ast_channel_peeraccount(chan), 
len);
        else if (!strcasecmp(data, "hangupsource"))
@@ -553,9 +553,11 @@
        } else if (!strncasecmp(data, "secure_bridge_", 14)) {
                struct ast_datastore *ds;
 
+               buf[0] = '\0';
                ast_channel_lock(chan);
                if ((ds = ast_channel_datastore_find(chan, &secure_call_info, 
NULL))) {
                        struct ast_secure_call_store *encrypt = ds->data;
+
                        if (!strcasecmp(data, "secure_bridge_signaling")) {
                                snprintf(buf, len, "%s", encrypt->signaling ? 
"1" : "");
                        } else if (!strcasecmp(data, "secure_bridge_media")) {


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to