changeset 9531:19a70bcc2220 libavcodec

mlpdec: Validate max_channel and max_matrix_channel.
author ramiro
date Tue, 21 Apr 2009 22:12:30 +0000
parents dbb16aa52d43
children 2aabf1a58f19
files mlp.h mlpdec.c
diffstat 2 files changed, 19 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mlp.h	Tue Apr 21 21:57:23 2009 +0000
+++ b/mlp.h	Tue Apr 21 22:12:30 2009 +0000
@@ -26,6 +26,9 @@
 
 #include "avcodec.h"
 
+/** Last possible matrix channel for each codec */
+#define MAX_MATRIX_CHANNEL_MLP      5
+#define MAX_MATRIX_CHANNEL_TRUEHD   7
 /** Maximum number of channels that can be decoded. */
 #define MAX_CHANNELS        16
 
--- a/mlpdec.c	Tue Apr 21 21:57:23 2009 +0000
+++ b/mlpdec.c	Tue Apr 21 22:12:30 2009 +0000
@@ -335,6 +335,9 @@
     uint8_t checksum;
     uint8_t lossless_check;
     int start_count = get_bits_count(gbp);
+    const int max_matrix_channel = m->avctx->codec_id == CODEC_ID_MLP
+                                 ? MAX_MATRIX_CHANNEL_MLP
+                                 : MAX_MATRIX_CHANNEL_TRUEHD;
 
     sync_word = get_bits(gbp, 13);
     s->noise_type = get_bits1(gbp);
@@ -352,6 +355,19 @@
     s->max_channel        = get_bits(gbp, 4);
     s->max_matrix_channel = get_bits(gbp, 4);
 
+    if (s->max_matrix_channel > max_matrix_channel) {
+        av_log(m->avctx, AV_LOG_ERROR,
+               "Max matrix channel cannot be greater than %d.\n",
+               max_matrix_channel);
+        return -1;
+    }
+
+    if (s->max_channel != s->max_matrix_channel) {
+        av_log(m->avctx, AV_LOG_ERROR,
+               "Max channel must be equal max matrix channel.\n");
+        return -1;
+    }
+
     if (s->min_channel > s->max_channel) {
         av_log(m->avctx, AV_LOG_ERROR,
                "Substream min channel cannot be greater than max channel.\n");