From a470bb9e277b8038e3e67931ae7905aa7dd87d7e Mon Sep 17 00:00:00 2001
From: Richard Mudgett <rmudgett@digium.com>
Date: Tue, 12 Jun 2018 15:13:14 -0500
Subject: [PATCH] channel: Fix some more unprotected channel flag setting.

Change-Id: I34c3b1201b1de539945bcfdcb264fff30332d48c
---
 channels/chan_dahdi.c | 4 ++++
 channels/sig_analog.c | 4 ++++
 main/channel.c        | 2 ++
 3 files changed, 10 insertions(+)

diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 34aed16ec4..f4f651487d 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -10045,7 +10045,9 @@ static void *analog_ss_thread(void *data)
 				 * emulation.  The DTMF digits can come so fast that emulation
 				 * can drop some of them.
 				 */
+				ast_channel_lock(chan);
 				ast_set_flag(ast_channel_flags(chan), AST_FLAG_END_DTMF_ONLY);
+				ast_channel_unlock(chan);
 				off_ms = 4000;/* This is a typical OFF time between rings. */
 				for (;;) {
 					struct ast_frame *f;
@@ -10078,7 +10080,9 @@ static void *analog_ss_thread(void *data)
 						ast_channel_state(chan) == AST_STATE_RINGING)
 						break; /* Got ring */
 				}
+				ast_channel_lock(chan);
 				ast_clear_flag(ast_channel_flags(chan), AST_FLAG_END_DTMF_ONLY);
+				ast_channel_unlock(chan);
 				dtmfbuf[k] = '\0';
 				dahdi_setlinear(p->subs[idx].dfd, p->subs[idx].linear);
 				/* Got cid and ring. */
diff --git a/channels/sig_analog.c b/channels/sig_analog.c
index 53f9fb2147..74b4789be0 100644
--- a/channels/sig_analog.c
+++ b/channels/sig_analog.c
@@ -2414,7 +2414,9 @@ static void *__analog_ss_thread(void *data)
 				 * emulation.  The DTMF digits can come so fast that emulation
 				 * can drop some of them.
 				 */
+				ast_channel_lock(chan);
 				ast_set_flag(ast_channel_flags(chan), AST_FLAG_END_DTMF_ONLY);
+				ast_channel_unlock(chan);
 				timeout_ms = 4000;/* This is a typical OFF time between rings. */
 				for (;;) {
 					struct ast_frame *f;
@@ -2449,7 +2451,9 @@ static void *__analog_ss_thread(void *data)
 						break; /* Got ring */
 					}
 				}
+				ast_channel_lock(chan);
 				ast_clear_flag(ast_channel_flags(chan), AST_FLAG_END_DTMF_ONLY);
+				ast_channel_unlock(chan);
 				dtmfbuf[k] = '\0';
 
 				analog_set_linear_mode(p, idx, oldlinearity);
diff --git a/main/channel.c b/main/channel.c
index d0261219e2..7d22fee432 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -5900,7 +5900,9 @@ struct ast_channel *__ast_request_and_dial(const char *type, struct ast_format_c
 	 */
 	ast_set_callerid(chan, cid_num, cid_name, cid_num);
 
+	ast_channel_lock(chan);
 	ast_set_flag(ast_channel_flags(chan), AST_FLAG_ORIGINATED);
+	ast_channel_unlock(chan);
 	ast_party_connected_line_set_init(&connected, ast_channel_connected(chan));
 	if (cid_num) {
 		connected.id.number.valid = 1;
-- 
GitLab