Add proper channel locking around the uses of datastore_add and _find. There
authorRussell Bryant <russell@russellbryant.com>
Tue, 28 Aug 2007 18:41:18 +0000 (18:41 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 28 Aug 2007 18:41:18 +0000 (18:41 +0000)
are still more places in the tree that I have not yet changed if someone wants
to go through and find the places they are used without the channel locked.

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

funcs/func_enum.c
pbx/pbx_dundi.c

index f3655be..677698c 100644 (file)
@@ -201,7 +201,9 @@ static int enum_query_read(struct ast_channel *chan, const char *cmd, char *data
 
        datastore->data = erds;
 
+       ast_channel_lock(chan);
        ast_channel_datastore_add(chan, datastore);
+       ast_channel_unlock(chan);
    
        res = 0;
     
@@ -246,7 +248,10 @@ static int enum_result_read(struct ast_channel *chan, const char *cmd, char *dat
                goto finish;
        }
 
-       if (!(datastore = ast_channel_datastore_find(chan, &enum_result_datastore_info, args.id))) {
+       ast_channel_lock(chan);
+       datastore = ast_channel_datastore_find(chan, &enum_result_datastore_info, args.id);
+       ast_channel_unlock(chan);
+       if (!datastore) {
                ast_log(LOG_WARNING, "No ENUM results found for query id!\n");
                goto finish;
        }
index e165104..169426c 100644 (file)
@@ -3934,7 +3934,9 @@ static int dundi_query_read(struct ast_channel *chan, const char *cmd, char *dat
        if (drds->num_results > 0)
                sort_results(drds->results, drds->num_results);
 
+       ast_channel_lock(chan);
        ast_channel_datastore_add(chan, datastore);
+       ast_channel_unlock(chan);
 
        ast_module_user_remove(u);
 
@@ -3991,11 +3993,16 @@ static int dundi_result_read(struct ast_channel *chan, const char *cmd, char *da
                ast_log(LOG_ERROR, "A result number must be given to DUNDIRESULT!\n");
                goto finish;
        }
+       
+       ast_channel_lock(chan);
+       datastore = ast_channel_datastore_find(chan, &dundi_result_datastore_info, args.id);
+       ast_channel_unlock(chan);
 
-       if (!(datastore = ast_channel_datastore_find(chan, &dundi_result_datastore_info, args.id))) {
+       if (!datastore) {
                ast_log(LOG_WARNING, "No DUNDi results found for query ID '%s'\n", args.id);
                goto finish;
        }
+
        drds = datastore->data;
 
        if (!strcasecmp(args.resultnum, "getnum")) {