Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRalph Giles <giles@mozilla.com>2012-12-01 06:00:38 +0400
committerRalph Giles <giles@mozilla.com>2012-12-01 06:00:38 +0400
commite7ec933cb8b8ebaeb82f89a3ffc34f290cdd7b02 (patch)
treeb6a368f0cfe03280cdcf03671d48042c89a36ac2 /tests
parent9345aaa5ca1c2fb7d62981b2a538e0ce20612c38 (diff)
Add a regression test for the padding issue.
This is a heavily modified version of the demonstration program Jüri Aedla posted to the mailing list. Verified to pass with the current commit, but fail with the tree from two commits ago. http://lists.xiph.org/pipermail/opus/2012-November/001834.html
Diffstat (limited to 'tests')
-rw-r--r--tests/test_opus_padding.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/tests/test_opus_padding.c b/tests/test_opus_padding.c
new file mode 100644
index 00000000..c5efc292
--- /dev/null
+++ b/tests/test_opus_padding.c
@@ -0,0 +1,67 @@
+/* Check for overflow in reading the padding length.
+ * Example by Jüri Aedla and Ralph Giles
+ * http://lists.xiph.org/pipermail/opus/2012-November/001834.html
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "opus.h"
+#include "test_opus_common.h"
+
+#define PACKETSIZE 16909318
+#define CHANNELS 2
+#define FRAMESIZE 5760
+
+int test_overflow(void)
+{
+ OpusDecoder *decoder;
+ int result;
+ int error;
+
+ unsigned char *in = malloc(PACKETSIZE);
+ opus_int16 *out = malloc(FRAMESIZE*CHANNELS*sizeof(*out));
+
+ fprintf(stderr, " Checking for padding overflow... ");
+ if (!in || !out) {
+ fprintf(stderr, "FAIL (out of memory)\n");
+ return -1;
+ }
+ in[0] = 0xff;
+ in[1] = 0x41;
+ memset(in + 2, 0xff, PACKETSIZE - 3);
+ in[PACKETSIZE-1] = 0x0b;
+
+ decoder = opus_decoder_create(48000, CHANNELS, &error);
+ result = opus_decode(decoder, in, PACKETSIZE, out, FRAMESIZE, 0);
+ opus_decoder_destroy(decoder);
+
+ free(in);
+ free(out);
+
+ if (result != OPUS_INVALID_PACKET) {
+ fprintf(stderr, "FAIL!\n");
+ test_failed();
+ }
+
+ fprintf(stderr, "OK.\n");
+
+ return 1;
+}
+
+int main(void)
+{
+ const char *oversion;
+ int tests = 0;;
+
+ iseed = 0;
+ oversion = opus_get_version_string();
+ if (!oversion) test_failed();
+ fprintf(stderr, "Testing %s padding.\n", oversion);
+
+ tests += test_overflow();
+
+ fprintf(stderr, "All padding tests passed.\n");
+
+ return 0;
+}