1 /*
   2  * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.io.ByteArrayInputStream;
  25 import java.io.IOException;
  26 import java.io.InputStream;
  27 
  28 import javax.sound.sampled.AudioSystem;
  29 import javax.sound.sampled.UnsupportedAudioFileException;
  30 import javax.sound.sampled.spi.AudioFileReader;
  31 
  32 import static java.util.ServiceLoader.load;
  33 
  34 /**
  35  * @test
  36  * @bug 7058662 7058666 7058672 8130305
  37  * @author Sergey Bylokhov
  38  */
  39 public final class ReadersExceptions {
  40 
  41     // empty channels
  42     static byte[] wrongAIFFCh =
  43             {0x46, 0x4f, 0x52, 0x4d, // AiffFileFormat.AIFF_MAGIC
  44              0, 0, 0, 0, // length
  45              0, 0, 0, 0, // iffType
  46              0x43, 0x4f, 0x4d, 0x4d, // chunkName
  47              0, 0, 0, 100, // chunkLen
  48              0, 0, // channels
  49              0, 0, 0, 0, //
  50              0, 10  // sampleSize
  51                     , 0, 0, 0, 0};
  52     // empty sampleSize
  53     static byte[] wrongAIFFSSL =
  54             {0x46, 0x4f, 0x52, 0x4d, //AiffFileFormat.AIFF_MAGIC
  55              0, 0, 0, 0, // length
  56              0, 0, 0, 0, // iffType
  57              0x43, 0x4f, 0x4d, 0x4d, // chunkName
  58              0, 0, 0, 100, // chunkLen
  59              0, 10, // channels
  60              0, 0, 0, 0, //
  61              0, 0  // sampleSize
  62                     , 0, 0, 0, 0};
  63     // big sampleSize
  64     static byte[] wrongAIFFSSH =
  65             {0x46, 0x4f, 0x52, 0x4d, //AiffFileFormat.AIFF_MAGIC
  66              0, 0, 0, 0, // length
  67              0, 0, 0, 0, // iffType
  68              0x43, 0x4f, 0x4d, 0x4d, // chunkName
  69              0, 0, 0, 100, // chunkLen
  70              0, 10, // channels
  71              0, 0, 0, 0, //
  72              0, 33  // sampleSize
  73                     , 0, 0, 0, 0};
  74     // empty channels
  75     static byte[] wrongAUCh =
  76             {0x2e, 0x73, 0x6e, 0x64,//AiffFileFormat.AU_SUN_MAGIC
  77              0, 0, 0, 24, // headerSize
  78              0, 0, 0, 0, // dataSize
  79              0, 0, 0, 1, // encoding_local AuFileFormat.AU_ULAW_8
  80              0, 0, 0, 1, // sampleRate
  81              0, 0, 0, 0 // channels
  82             };
  83     // empty sample rate
  84     static byte[] wrongAUSR =
  85             {0x2e, 0x73, 0x6e, 0x64,//AiffFileFormat.AU_SUN_MAGIC
  86              0, 0, 0, 24, // headerSize
  87              0, 0, 0, 0, // dataSize
  88              0, 0, 0, 1, // encoding_local AuFileFormat.AU_ULAW_8
  89              0, 0, 0, 0, // sampleRate
  90              0, 0, 0, 1 // channels
  91             };
  92     // empty header size
  93     static byte[] wrongAUEmptyHeader =
  94             {0x2e, 0x73, 0x6e, 0x64,//AiffFileFormat.AU_SUN_MAGIC
  95              0, 0, 0, 0, // headerSize
  96              0, 0, 0, 0, // dataSize
  97              0, 0, 0, 1, // encoding_local AuFileFormat.AU_ULAW_8
  98              0, 0, 0, 1, // sampleRate
  99              0, 0, 0, 1 // channels
 100             };
 101     // small header size
 102     static byte[] wrongAUSmallHeader =
 103             {0x2e, 0x73, 0x6e, 0x64,//AiffFileFormat.AU_SUN_MAGIC
 104              0, 0, 0, 7, // headerSize
 105              0, 0, 0, 0, // dataSize
 106              0, 0, 0, 1, // encoding_local AuFileFormat.AU_ULAW_8
 107              0, 0, 0, 1, // sampleRate
 108              0, 0, 0, 1 // channels
 109             };
 110     // frame size overflow, when result negative
 111     static byte[] wrongAUFrameSizeOverflowNegativeResult =
 112             {0x2e, 0x73, 0x6e, 0x64,//AiffFileFormat.AU_SUN_MAGIC
 113              0, 0, 0, 24, // headerSize
 114              0, 0, 0, 0, // dataSize
 115              0, 0, 0, 5, // encoding_local AuFileFormat.AU_LINEAR_32
 116              0, 0, 0, 1, // sampleRate
 117              0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF // channels
 118             };
 119     // frame size overflow, when result positive
 120     static byte[] wrongAUFrameSizeOverflowPositiveResult =
 121             {0x2e, 0x73, 0x6e, 0x64,//AiffFileFormat.AU_SUN_MAGIC
 122              0, 0, 0, 24, // headerSize
 123              0, 0, 0, 0, // dataSize
 124              0, 0, 0, 4, // encoding_local AuFileFormat.AU_LINEAR_24
 125              0, 0, 0, 1, // sampleRate
 126              0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF // channels
 127             };
 128     // empty channels
 129     static byte[] wrongWAVCh =
 130             {0x52, 0x49, 0x46, 0x46, // WaveFileFormat.RIFF_MAGIC
 131              1, 1, 1, 1, // fileLength
 132              0x57, 0x41, 0x56, 0x45, //  waveMagic
 133              0x66, 0x6d, 0x74, 0x20, // FMT_MAGIC
 134              3, 0, 0, 0, // length
 135              1, 0, // wav_type  WAVE_FORMAT_PCM
 136              0, 0, // channels
 137              0, 0, 0, 0, // sampleRate
 138              0, 0, 0, 0, // avgBytesPerSec
 139              0, 0, // blockAlign
 140              1, 0, // sampleSizeInBits
 141              0x64, 0x61, 0x74, 0x61, // WaveFileFormat.DATA_MAGIC
 142              0, 0, 0, 0, // dataLength
 143             };
 144     // empty sampleSizeInBits
 145     static byte[] wrongWAVSSB =
 146             {0x52, 0x49, 0x46, 0x46, // WaveFileFormat.RIFF_MAGIC
 147              1, 1, 1, 1, // fileLength
 148              0x57, 0x41, 0x56, 0x45, //  waveMagic
 149              0x66, 0x6d, 0x74, 0x20, // FMT_MAGIC
 150              3, 0, 0, 0, // length
 151              1, 0, // wav_type  WAVE_FORMAT_PCM
 152              1, 0, // channels
 153              0, 0, 0, 0, // sampleRate
 154              0, 0, 0, 0, // avgBytesPerSec
 155              0, 0, // blockAlign
 156              0, 0, // sampleSizeInBits
 157              0x64, 0x61, 0x74, 0x61, // WaveFileFormat.DATA_MAGIC
 158              0, 0, 0, 0, // dataLength
 159             };
 160 
 161     static byte[][] data = {
 162             wrongAIFFCh, wrongAIFFSSL, wrongAIFFSSH, wrongAUCh, wrongAUSR,
 163             wrongAUEmptyHeader, wrongAUSmallHeader,
 164             wrongAUFrameSizeOverflowNegativeResult,
 165             wrongAUFrameSizeOverflowPositiveResult, wrongWAVCh, wrongWAVSSB
 166     };
 167 
 168     public static void main(final String[] args) throws IOException {
 169         for (final byte[] bytes : data) {
 170             testAS(bytes);
 171             testAFR(bytes);
 172         }
 173     }
 174 
 175     private static void testAS(final byte[] buffer) throws IOException {
 176         // AudioSystem API
 177         final InputStream is = new ByteArrayInputStream(buffer);
 178         try {
 179             AudioSystem.getAudioFileFormat(is);
 180         } catch (UnsupportedAudioFileException ignored) {
 181             // Expected.
 182             return;
 183         }
 184         throw new RuntimeException("Test Failed");
 185     }
 186 
 187     private static void testAFR(final byte[] buffer) throws IOException {
 188         // AudioFileReader API
 189         final InputStream is = new ByteArrayInputStream(buffer);
 190         for (final AudioFileReader afr : load(AudioFileReader.class)) {
 191             for (int i = 0; i < 10; ++i) {
 192                 try {
 193                     afr.getAudioFileFormat(is);
 194                     throw new RuntimeException("UAFE expected");
 195                 } catch (final UnsupportedAudioFileException ignored) {
 196                     // Expected.
 197                 }
 198             }
 199         }
 200     }
 201 }