From 259e166648832ba5bf4ed4d08aca87e8f5e8fe5c Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@jmvalin.ca>
Date: Mon, 3 Dec 2012 13:05:24 -0500
Subject: [PATCH] Fix packet length handling for 16-bit machines (makes no
 difference on 32-bit)

---
 src/opus_decoder.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/opus_decoder.c b/src/opus_decoder.c
index 0be6730d1..f0af5e746 100644
--- a/src/opus_decoder.c
+++ b/src/opus_decoder.c
@@ -589,7 +589,7 @@ static int opus_packet_parse_impl(const unsigned char *data, opus_int32 len,
    int cbr;
    unsigned char ch, toc;
    int framesize;
-   int last_size;
+   opus_int32 last_size;
    const unsigned char *data0 = data;
 
    if (size==NULL)
@@ -615,7 +615,9 @@ static int opus_packet_parse_impl(const unsigned char *data, opus_int32 len,
       {
          if (len&0x1)
             return OPUS_INVALID_PACKET;
-         size[0] = last_size = len/2;
+         last_size = len/2;
+         /* If last_size doesn't fit in size[0], we'll catch it later */
+         size[0] = (short)last_size;
       }
       break;
    /* Two VBR frames */
@@ -676,7 +678,7 @@ static int opus_packet_parse_impl(const unsigned char *data, opus_int32 len,
          if (last_size*count!=len)
             return OPUS_INVALID_PACKET;
          for (i=0;i<count-1;i++)
-            size[i] = last_size;
+            size[i] = (short)last_size;
       }
       break;
    }
@@ -704,7 +706,7 @@ static int opus_packet_parse_impl(const unsigned char *data, opus_int32 len,
          1275. Reject them here.*/
       if (last_size > 1275)
          return OPUS_INVALID_PACKET;
-      size[count-1] = last_size;
+      size[count-1] = (short)last_size;
    }
 
    if (frames)
-- 
GitLab