ref: 49c5f271e9a69fff754a17be226e44721aa6de8d
parent: 7609f0c1d95537ac9bbf8b5651f1c21ecbd74bfb
author: Mark Harris <[email protected]>
date: Wed Sep 30 21:44:34 EDT 2015
opusenc: Use correct types for WAV/AIFF fields Don't treat unsigned fields as negative. Fixes crash due to negative totalsamples.
--- a/src/audio-in.c
+++ b/src/audio-in.c
@@ -94,13 +94,13 @@
/* Macros to read header data */
#define READ_U32_LE(buf) \
- (((buf)[3]<<24)|((buf)[2]<<16)|((buf)[1]<<8)|((buf)[0]&0xff))
+ (((unsigned int)(buf)[3]<<24)|((buf)[2]<<16)|((buf)[1]<<8)|((buf)[0]))
#define READ_U16_LE(buf) \
(((buf)[1]<<8)|((buf)[0]&0xff))
#define READ_U32_BE(buf) \
- (((buf)[0]<<24)|((buf)[1]<<16)|((buf)[2]<<8)|((buf)[3]&0xff))
+ (((unsigned int)(buf)[0]<<24)|((buf)[1]<<16)|((buf)[2]<<8)|((buf)[3]))
#define READ_U16_BE(buf) \
(((buf)[0]<<8)|((buf)[1]&0xff))
@@ -370,7 +370,7 @@
format.channels = (short)READ_U16_BE(buffer);
format.totalframes = READ_U32_BE(buffer+2);
- format.samplesize = READ_U16_BE(buffer+6);
+ format.samplesize = (short)READ_U16_BE(buffer+6);
format.rate = (int)read_IEEE80(buffer+8);
if(format.channels <= 0)
@@ -549,7 +549,7 @@
return 0;
}
- if(format.format == -2) /* WAVE_FORMAT_EXTENSIBLE */
+ if(format.format == 0xfffe) /* WAVE_FORMAT_EXTENSIBLE */
{
if(len<40)
{
@@ -590,7 +590,7 @@
case 1599: /* 7.1 */
break;
default:
- fprintf(stderr, _("WARNING: Unknown WAV surround channel mask: %d\n"
+ fprintf(stderr, _("WARNING: Unknown WAV surround channel mask: %u\n"
"Blindly mapping speakers using default SMPTE/ITU ordering.\n"),
format.mask);
break;
@@ -727,7 +727,7 @@
opus_int64 realsamples;
int *ch_permute = f->channel_permute;
- if(f->totalsamples && f->samplesread +
+ if(f->totalsamples > 0 && f->samplesread +
bytes_read/(sampbyte*f->channels) > f->totalsamples) {
bytes_read = sampbyte*f->channels*(f->totalsamples - f->samplesread);
}
@@ -822,7 +822,7 @@
int i,j;
opus_int64 realsamples;
- if(f->totalsamples && f->samplesread +
+ if(f->totalsamples > 0 && f->samplesread +
bytes_read/(4*f->channels) > f->totalsamples)
bytes_read = 4*f->channels*(f->totalsamples - f->samplesread);
@@ -846,24 +846,16 @@
int raw_open(FILE *in, oe_enc_opt *opt, unsigned char *buf, int buflen)
{
- wav_fmt format; /* fake wave header ;) */
wavfile *wav = malloc(sizeof(wavfile));
int i;
(void)buf;/*unused*/
(void)buflen;/*unused*/
- /* construct fake wav header ;) */
- format.format = 2;
- format.channels = opt->channels;
- format.samplerate = opt->rate;
- format.samplesize = opt->samplesize;
- format.bytespersec = opt->channels * opt->rate * opt->samplesize / 8;
- format.align = format.bytespersec;
wav->f = in;
wav->samplesread = 0;
wav->bigendian = opt->endianness;
- wav->unsigned8bit = format.samplesize == 8;
- wav->channels = format.channels;
+ wav->unsigned8bit = opt->samplesize == 8;
+ wav->channels = opt->channels;
wav->samplesize = opt->samplesize;
wav->totalsamples = 0;
wav->channel_permute = malloc(wav->channels * sizeof(int));
--- a/src/opusenc.h
+++ b/src/opusenc.h
@@ -60,12 +60,12 @@
} input_format;
typedef struct {
- short format;
+ unsigned short format;
unsigned short channels;
- int samplerate;
- int bytespersec;
- short align;
- short samplesize;
+ unsigned int samplerate;
+ unsigned int bytespersec;
+ unsigned short align;
+ unsigned short samplesize;
unsigned int mask;
} wav_fmt;
@@ -82,11 +82,11 @@
typedef struct {
short channels;
- opus_int64 totalframes;
+ unsigned int totalframes;
short samplesize;
int rate;
unsigned int offset;
- int blocksize;
+ unsigned int blocksize;
} aiff_fmt;
typedef wavfile aifffile; /* They're the same */