From 9ddc843fbeecfcfbe2ff54d916fe9d18de2a77c7 Mon Sep 17 00:00:00 2001
From: Mark Michelson <mmichelson@digium.com>
Date: Mon, 14 Apr 2008 15:01:36 +0000
Subject: [PATCH] Merged revisions 114106 via svnmerge from
 https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r114106 | mmichelson | 2008-04-14 09:58:02 -0500 (Mon, 14 Apr 2008) | 5 lines

Save a local copy of the generate callback prior to unlocking the channel in
case the generate callback goes NULL on us after the channel is unlocked. Thanks
to Russell for pointing this need out to me.


........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114107 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/channel.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/main/channel.c b/main/channel.c
index b253cc102d..6b29fd9ec5 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -2255,6 +2255,7 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram
 {
 	if (chan->generatordata &&  !ast_internal_timing_enabled(chan)) {
 		void *tmp = chan->generatordata;
+		int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples) = NULL;
 		int res;
 		int samples;
 
@@ -2273,6 +2274,10 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram
 		} else {
 			samples = f->samples;
 		}
+		
+		if (chan->generator->generate) {
+			generate = chan->generator->generate;
+		}
 		/* This unlock is here based on two assumptions that hold true at this point in the
 		 * code. 1) this function is only called from within __ast_read() and 2) all generators
 		 * call ast_write() in their generate callback.
@@ -2282,7 +2287,7 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram
 		 * avoidance not to work in deeper functions
 		 */
 		ast_channel_unlock(chan);
-		res = chan->generator->generate(chan, tmp, f->datalen, samples);
+		res = generate(chan, tmp, f->datalen, f->samples);
 		ast_channel_lock(chan);
 		chan->generatordata = tmp;
 		if (res) {
-- 
GitLab