forked from mia/Aegisub
Avoid strncmp() for checking fourCC codes and use a handcrafted function for it instead. Also add some assertions for null pointer checks.
Originally committed to SVN as r2231.
This commit is contained in:
parent
a4fc3e8b13
commit
2c7da25e91
1 changed files with 17 additions and 4 deletions
|
@ -40,6 +40,7 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "aegisub_endian.h"
|
#include "aegisub_endian.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#ifndef _WINDOWS
|
#ifndef _WINDOWS
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
@ -260,6 +261,17 @@ private:
|
||||||
// either way, as the fields can depend on the compression.
|
// either way, as the fields can depend on the compression.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool CheckFourcc(char *str1, char *str2)
|
||||||
|
{
|
||||||
|
assert(str1);
|
||||||
|
assert(str2);
|
||||||
|
return
|
||||||
|
(str1[0] == str2[0]) &&
|
||||||
|
(str1[1] == str2[1]) &&
|
||||||
|
(str1[2] == str2[2]) &&
|
||||||
|
(str1[3] == str2[3]);
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RiffWavPCMAudioProvider(const wxString &_filename)
|
RiffWavPCMAudioProvider(const wxString &_filename)
|
||||||
: PCMAudioProvider(_filename)
|
: PCMAudioProvider(_filename)
|
||||||
|
@ -269,11 +281,12 @@ public:
|
||||||
// Read header
|
// Read header
|
||||||
// Assume we won't get files smaller than 256 bytes
|
// Assume we won't get files smaller than 256 bytes
|
||||||
void *filestart = EnsureRangeAccessible(0, sizeof(RIFFChunk));
|
void *filestart = EnsureRangeAccessible(0, sizeof(RIFFChunk));
|
||||||
|
assert(filestart);
|
||||||
RIFFChunk &header = *(RIFFChunk*)filestart;
|
RIFFChunk &header = *(RIFFChunk*)filestart;
|
||||||
|
|
||||||
// Check that it's good
|
// Check that it's good
|
||||||
if (strncmp(header.ch.type, "RIFF", 4)) throw _T("RIFF PCM WAV audio provider: File is not a RIFF file");
|
if (!CheckFourcc(header.ch.type, "RIFF")) throw _T("RIFF PCM WAV audio provider: File is not a RIFF file");
|
||||||
if (strncmp(header.format, "WAVE", 4)) throw _T("RIFF PCM WAV audio provider: File is not a RIFF WAV file");
|
if (!CheckFourcc(header.format, "WAVE")) throw _T("RIFF PCM WAV audio provider: File is not a RIFF WAV file");
|
||||||
|
|
||||||
// Count how much more data we can have in the entire file
|
// Count how much more data we can have in the entire file
|
||||||
// The first 4 bytes are already eaten by the header.format field
|
// The first 4 bytes are already eaten by the header.format field
|
||||||
|
@ -295,7 +308,7 @@ public:
|
||||||
data_left -= sizeof(ch);
|
data_left -= sizeof(ch);
|
||||||
filepos += sizeof(ch);
|
filepos += sizeof(ch);
|
||||||
|
|
||||||
if (strncmp(ch.type, "fmt ", 4) == 0) {
|
if (CheckFourcc(ch.type, "fmt ")) {
|
||||||
if (got_fmt_header) throw _T("RIFF PCM WAV audio provider: Invalid file, multiple 'fmt ' chunks");
|
if (got_fmt_header) throw _T("RIFF PCM WAV audio provider: Invalid file, multiple 'fmt ' chunks");
|
||||||
got_fmt_header = true;
|
got_fmt_header = true;
|
||||||
|
|
||||||
|
@ -309,7 +322,7 @@ public:
|
||||||
bytes_per_sample = (Endian::LittleToMachine(fmt.significant_bits_sample) + 7) / 8; // round up to nearest whole byte
|
bytes_per_sample = (Endian::LittleToMachine(fmt.significant_bits_sample) + 7) / 8; // round up to nearest whole byte
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (strncmp(ch.type, "data", 4) == 0) {
|
else if (CheckFourcc(ch.type, "data")) {
|
||||||
// This won't pick up 'data' chunks inside 'wavl' chunks
|
// This won't pick up 'data' chunks inside 'wavl' chunks
|
||||||
// since the 'wavl' chunks wrap those.
|
// since the 'wavl' chunks wrap those.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue