From 16c5dda8ab1dc44824c52baa4ff9e34de4a26f1a Mon Sep 17 00:00:00 2001
From: Jonathan Rose <jrose@digium.com>
Date: Mon, 14 Mar 2011 13:12:51 +0000
Subject: [PATCH] Fixes null reference bug introduced by audio hook changes
 that affects various OS distributions.  Thanks David.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@310547 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/audiohook.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/main/audiohook.c b/main/audiohook.c
index bb510e333f..a1d658ce70 100644
--- a/main/audiohook.c
+++ b/main/audiohook.c
@@ -311,25 +311,26 @@ static struct ast_frame *audiohook_read_frame_both(struct ast_audiohook *audioho
 	ast_debug(1, "Failed to get %d samples from write factory %p\n", (int)samples, &audiohook->write_factory);
 
 	/* Basically we figure out which buffer to use... and if mixing can be done here */
-	if (!read_buf && !write_buf)
-		return NULL;
-
-	if (read_buf) {
-		final_buf = buf1;
-		frame.data.ptr = final_buf;
+	if (read_buf && read_reference) {
+		frame.data.ptr = buf1;
 		*read_reference = ast_frdup(&frame);
 	}
-
-	if (write_buf) {
-		final_buf = buf2;
-		frame.data.ptr = final_buf;
+	if (write_buf && write_reference) {
+		frame.data.ptr = buf2;
 		*write_reference = ast_frdup(&frame);
 	}
 
 	if (read_buf && write_buf) {
-		for (i = 0, data1 = read_buf, data2 = write_buf; i < samples; i++, data1++, data2++)
+		for (i = 0, data1 = read_buf, data2 = write_buf; i < samples; i++, data1++, data2++) {
 			ast_slinear_saturated_add(data1, data2);
+		}
+		final_buf = buf1;
+	} else if (read_buf) {
 		final_buf = buf1;
+	} else if (write_buf) {
+		final_buf = buf2;
+	} else {
+		return NULL;
 	}
 
 	/* Make the final buffer part of the frame, so it gets duplicated fine */
-- 
GitLab