I noted this on the dev list but got no response, so I just did it myself.
authorRussell Bryant <russell@russellbryant.com>
Tue, 8 May 2007 16:41:35 +0000 (16:41 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 8 May 2007 16:41:35 +0000 (16:41 +0000)
Lock the call features when being used in chan_sip.

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

channels/chan_sip.c
include/asterisk/features.h
res/res_features.c

index 41234b8..60e6ee5 100644 (file)
@@ -11653,14 +11653,17 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
                        pbx.
                */
                /* first, get the feature string, if it exists */
-               struct ast_call_feature *feat = ast_find_call_feature("automon");
+               struct ast_call_feature *feat;
                int j;
                struct ast_frame f = { AST_FRAME_DTMF, };
-               
+
+               ast_rdlock_call_features();
+               feat = ast_find_call_feature("automon");
                if (!feat || ast_strlen_zero(feat->exten)) {
                        ast_log(LOG_WARNING,"Recording requested, but no One Touch Monitor registered. (See features.conf)\n");
                        /* 403 means that we don't support this feature, so don't request it again */
                        transmit_response(p, "403 Forbidden", req);
+                       ast_unlock_call_features();
                        return;
                } 
                /* OEJ: Why is the DTMF code included in the record section? */
@@ -11671,6 +11674,7 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
                        if (sipdebug)
                                ast_verbose("* DTMF-relay event received: %c\n", f.subclass);
                }
+               ast_unlock_call_features();
 #ifdef DISABLED_CODE
                /* And feat isn't used here - Is this code tested at all??? 
                        We just send a reply ... 
index 2174e99..1a5d760 100644 (file)
@@ -96,6 +96,9 @@ void ast_unregister_feature(struct ast_call_feature *feature);
 
 /*! \brief look for a call feature entry by its sname
        \param name a string ptr, should match "automon", "blindxfer", "atxfer", etc. */
-struct ast_call_feature *ast_find_call_feature(char *name);
+struct ast_call_feature *ast_find_call_feature(const char *name);
+
+void ast_rdlock_call_features(void);
+void ast_unlock_call_features(void);
 
 #endif /* _AST_FEATURES_H */
index 7177df0..2ae9834 100644 (file)
@@ -1070,14 +1070,23 @@ static struct ast_call_feature *find_feature(const char *name)
        return tmp;
 }
 
+void ast_rdlock_call_features(void)
+{
+       ast_rwlock_rdlock(&features_lock);
+}
+
+void ast_unlock_call_features(void)
+{
+       ast_rwlock_unlock(&features_lock);
+}
+
 /*! \brief find a call feature by name */
-struct ast_call_feature *ast_find_call_feature(char *name)
+struct ast_call_feature *ast_find_call_feature(const char *name)
 {
        int x;
        for (x = 0; x < FEATURES_COUNT; x++) {
-               if (!strcasecmp(name, builtin_features[x].sname)) {
+               if (!strcasecmp(name, builtin_features[x].sname))
                        return &builtin_features[x];
-               }
        }
        return NULL;
 }