xref: /aosp_15_r20/external/libopus/tests/test_opus_padding.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
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