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
This commit is contained in:
Richard Mudgett
2017-10-25 14:38:19 -05:00
parent 28368b3553
commit ca7f3d297b

View File

@@ -393,6 +393,11 @@ unsigned int ast_codec_samples_count(struct ast_frame *frame)
if (codec->samples_count) { if (codec->samples_count) {
samples = codec->samples_count(frame); 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 { } else {
ast_log(LOG_WARNING, "Unable to calculate samples for codec %s\n", ast_log(LOG_WARNING, "Unable to calculate samples for codec %s\n",
ast_format_get_name(frame->subclass.format)); ast_format_get_name(frame->subclass.format));