From 2ca3dbb197078e4381b932cc7d83ca8b6c088fd1 Mon Sep 17 00:00:00 2001
From: Richard Mudgett <rmudgett@digium.com>
Date: Wed, 25 Oct 2017 14:38:19 -0500
Subject: [PATCH] codec.c: Defensively check the returned samples.

Earlier versions of the codec_opus samples_count callback can return
negative error values on undecodable frames.  This resulted in a divide by
zero exception.

* Added a defensive check in ast_codec_samples_count() for a "negative"
samples count return value.  Log the event and set the count to zero.

ASTERISK-27194

Change-Id: Icf69350307ecbbc80a3d74de46af9bd80ea17819
---
 main/codec.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/main/codec.c b/main/codec.c
index 7797147a79..5b262f6a11 100644
--- a/main/codec.c
+++ b/main/codec.c
@@ -406,6 +406,11 @@ unsigned int ast_codec_samples_count(struct ast_frame *frame)
 
 	if (codec->samples_count) {
 		samples = codec->samples_count(frame);
+		if ((int) samples < 0) {
+			ast_log(LOG_WARNING, "Codec %s returned invalid number of samples.\n",
+				ast_format_get_name(frame->subclass.format));
+			samples = 0;
+		}
 	} else {
 		ast_log(LOG_WARNING, "Unable to calculate samples for codec %s\n",
 			ast_format_get_name(frame->subclass.format));
-- 
GitLab