1*a58d3d2aSXin Li /* Copyright (c) 2012 Xiph.Org Foundation
2*a58d3d2aSXin Li Written by Jüri Aedla and Ralph Giles */
3*a58d3d2aSXin Li /*
4*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
5*a58d3d2aSXin Li modification, are permitted provided that the following conditions
6*a58d3d2aSXin Li are met:
7*a58d3d2aSXin Li
8*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer.
10*a58d3d2aSXin Li
11*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
12*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
13*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
14*a58d3d2aSXin Li
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*a58d3d2aSXin Li ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*a58d3d2aSXin Li LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18*a58d3d2aSXin Li A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19*a58d3d2aSXin Li OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20*a58d3d2aSXin Li EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21*a58d3d2aSXin Li PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22*a58d3d2aSXin Li PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23*a58d3d2aSXin Li LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24*a58d3d2aSXin Li NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*a58d3d2aSXin Li SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li */
27*a58d3d2aSXin Li
28*a58d3d2aSXin Li /* Check for overflow in reading the padding length.
29*a58d3d2aSXin Li * http://lists.xiph.org/pipermail/opus/2012-November/001834.html
30*a58d3d2aSXin Li */
31*a58d3d2aSXin Li
32*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
33*a58d3d2aSXin Li #include "config.h"
34*a58d3d2aSXin Li #endif
35*a58d3d2aSXin Li
36*a58d3d2aSXin Li #include <stdio.h>
37*a58d3d2aSXin Li #include <stdlib.h>
38*a58d3d2aSXin Li #include <string.h>
39*a58d3d2aSXin Li #include "opus.h"
40*a58d3d2aSXin Li #include "test_opus_common.h"
41*a58d3d2aSXin Li
42*a58d3d2aSXin Li #define PACKETSIZE 16909318
43*a58d3d2aSXin Li #define CHANNELS 2
44*a58d3d2aSXin Li #define FRAMESIZE 5760
45*a58d3d2aSXin Li
test_overflow(void)46*a58d3d2aSXin Li void test_overflow(void)
47*a58d3d2aSXin Li {
48*a58d3d2aSXin Li OpusDecoder *decoder;
49*a58d3d2aSXin Li int result;
50*a58d3d2aSXin Li int error;
51*a58d3d2aSXin Li
52*a58d3d2aSXin Li unsigned char *in = malloc(PACKETSIZE);
53*a58d3d2aSXin Li opus_int16 *out = malloc(FRAMESIZE*CHANNELS*sizeof(*out));
54*a58d3d2aSXin Li
55*a58d3d2aSXin Li fprintf(stderr, " Checking for padding overflow... ");
56*a58d3d2aSXin Li if (!in || !out) {
57*a58d3d2aSXin Li fprintf(stderr, "FAIL (out of memory)\n");
58*a58d3d2aSXin Li test_failed();
59*a58d3d2aSXin Li }
60*a58d3d2aSXin Li in[0] = 0xff;
61*a58d3d2aSXin Li in[1] = 0x41;
62*a58d3d2aSXin Li memset(in + 2, 0xff, PACKETSIZE - 3);
63*a58d3d2aSXin Li in[PACKETSIZE-1] = 0x0b;
64*a58d3d2aSXin Li
65*a58d3d2aSXin Li decoder = opus_decoder_create(48000, CHANNELS, &error);
66*a58d3d2aSXin Li result = opus_decode(decoder, in, PACKETSIZE, out, FRAMESIZE, 0);
67*a58d3d2aSXin Li opus_decoder_destroy(decoder);
68*a58d3d2aSXin Li
69*a58d3d2aSXin Li free(in);
70*a58d3d2aSXin Li free(out);
71*a58d3d2aSXin Li
72*a58d3d2aSXin Li if (result != OPUS_INVALID_PACKET) {
73*a58d3d2aSXin Li fprintf(stderr, "FAIL!\n");
74*a58d3d2aSXin Li test_failed();
75*a58d3d2aSXin Li }
76*a58d3d2aSXin Li
77*a58d3d2aSXin Li fprintf(stderr, "OK.\n");
78*a58d3d2aSXin Li }
79*a58d3d2aSXin Li
main(void)80*a58d3d2aSXin Li int main(void)
81*a58d3d2aSXin Li {
82*a58d3d2aSXin Li const char *oversion;
83*a58d3d2aSXin Li
84*a58d3d2aSXin Li iseed = 0;
85*a58d3d2aSXin Li oversion = opus_get_version_string();
86*a58d3d2aSXin Li if (!oversion) test_failed();
87*a58d3d2aSXin Li fprintf(stderr, "Testing %s padding.\n", oversion);
88*a58d3d2aSXin Li
89*a58d3d2aSXin Li test_overflow();
90*a58d3d2aSXin Li
91*a58d3d2aSXin Li fprintf(stderr, "All padding tests passed.\n");
92*a58d3d2aSXin Li
93*a58d3d2aSXin Li return 0;
94*a58d3d2aSXin Li }
95