2021-10-06 Fred Gleason <fredg@paravelsystems.com>

* Fixed an arithmetic overflow bug in 'RDWaveFile' that could
	cause the play length of MPEG-encoded to be incorrectly calculated.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-10-06 14:03:07 -04:00
parent 6d34ca7ee8
commit 9fcd7aaab1
2 changed files with 6 additions and 556 deletions

View File

@ -22507,3 +22507,6 @@
2021-10-06 Fred Gleason <fredg@paravelsystems.com>
* Increased the import process timeout for the WebGet service
to 1200 seconds.
2021-10-06 Fred Gleason <fredg@paravelsystems.com>
* Fixed an arithmetic overflow bug in 'RDWaveFile' that could
cause the play length of MPEG-encoded to be incorrectly calculated.

View File

@ -3864,9 +3864,9 @@ bool RDWaveFile::GetMpegHeader(int fd,int offset)
time_length=
total_frame_quan*__samples_per_frame[version_index][layer_index]/
__samplerates[version_index][samprate_index];
ext_time_length=1000*total_frame_quan*
__samples_per_frame[version_index][layer_index]/
__samplerates[version_index][samprate_index];
ext_time_length=1000*(int64_t)total_frame_quan*
(int64_t)__samples_per_frame[version_index][layer_index]/
(int64_t)__samplerates[version_index][samprate_index];
}
}
if(total_frame_quan<0) {
@ -3886,559 +3886,6 @@ bool RDWaveFile::GetMpegHeader(int fd,int offset)
}
/*
bool RDWaveFile::GetMpegHeader(int fd,int offset)
{
unsigned char buffer[4];
int n;
lseek(fd,offset,SEEK_SET);
if((n=read(fd,buffer,4))!=4) {
return false;
}
//
// Sync
//
if((buffer[0]!=0xFF)||((buffer[1]&0xE0)!=0xE0)) {
return false;
}
//
// MPEG Id
//
if((buffer[1]&0x08)==0) {
mpeg_id=RDWaveFile::Mpeg2;
}
else {
mpeg_id=RDWaveFile::Mpeg1;
}
//
// Layer
//
switch((buffer[1]&0x06)>>1) {
case 1:
head_layer=3;
break;
case 2:
head_layer=2;
break;
case 3:
head_layer=1;
break;
default:
return false;
}
//
// Bitrate
//
switch(mpeg_id) {
case RDWaveFile::Mpeg1:
switch(head_layer) {
case 1:
switch(buffer[2]>>4) {
case 1:
head_bit_rate=32000;
break;
case 2:
head_bit_rate=64000;
break;
case 3:
head_bit_rate=96000;
break;
case 4:
head_bit_rate=128000;
break;
case 5:
head_bit_rate=160000;
break;
case 6:
head_bit_rate=192000;
break;
case 7:
head_bit_rate=224000;
break;
case 8:
head_bit_rate=256000;
break;
case 9:
head_bit_rate=288000;
break;
case 10:
head_bit_rate=320000;
break;
case 11:
head_bit_rate=352000;
break;
case 12:
head_bit_rate=384000;
break;
case 13:
head_bit_rate=416000;
break;
case 14:
head_bit_rate=448000;
break;
default:
return false;
}
break;
case 2:
switch(buffer[2]>>4) {
case 1:
head_bit_rate=32000;
break;
case 2:
head_bit_rate=48000;
break;
case 3:
head_bit_rate=56000;
break;
case 4:
head_bit_rate=64000;
break;
case 5:
head_bit_rate=80000;
break;
case 6:
head_bit_rate=96000;
break;
case 7:
head_bit_rate=112000;
break;
case 8:
head_bit_rate=128000;
break;
case 9:
head_bit_rate=160000;
break;
case 10:
head_bit_rate=192000;
break;
case 11:
head_bit_rate=224000;
break;
case 12:
head_bit_rate=256000;
break;
case 13:
head_bit_rate=320000;
break;
case 14:
head_bit_rate=384000;
break;
default:
return false;
break;
}
break;
case 3:
switch(buffer[2]>>4) {
case 1:
head_bit_rate=32000;
break;
case 2:
head_bit_rate=40000;
break;
case 3:
head_bit_rate=48000;
break;
case 4:
head_bit_rate=56000;
break;
case 5:
head_bit_rate=64000;
break;
case 6:
head_bit_rate=80000;
break;
case 7:
head_bit_rate=96000;
break;
case 8:
head_bit_rate=112000;
break;
case 9:
head_bit_rate=128000;
break;
case 10:
head_bit_rate=160000;
break;
case 11:
head_bit_rate=192000;
break;
case 12:
head_bit_rate=224000;
break;
case 13:
head_bit_rate=256000;
break;
case 14:
head_bit_rate=320000;
break;
default:
return false;
break;
}
break;
}
break;
case RDWaveFile::Mpeg2:
switch(head_layer) {
case 1:
switch(buffer[2]>>4) {
case 1:
head_bit_rate=32000;
break;
case 2:
head_bit_rate=48000;
break;
case 3:
head_bit_rate=56000;
break;
case 4:
head_bit_rate=64000;
break;
case 5:
head_bit_rate=80000;
break;
case 6:
head_bit_rate=96000;
break;
case 7:
head_bit_rate=112000;
break;
case 8:
head_bit_rate=128000;
break;
case 9:
head_bit_rate=144000;
break;
case 10:
head_bit_rate=160000;
break;
case 11:
head_bit_rate=176000;
break;
case 12:
head_bit_rate=192000;
break;
case 13:
head_bit_rate=224000;
break;
case 14:
head_bit_rate=256000;
break;
default:
return false;
}
break;
case 2:
switch(buffer[2]>>4) {
case 1:
head_bit_rate=8000;
break;
case 2:
head_bit_rate=16000;
break;
case 3:
head_bit_rate=24000;
break;
case 4:
head_bit_rate=32000;
break;
case 5:
head_bit_rate=40000;
break;
case 6:
head_bit_rate=48000;
break;
case 7:
head_bit_rate=56000;
break;
case 8:
head_bit_rate=64000;
break;
case 9:
head_bit_rate=80000;
break;
case 10:
head_bit_rate=96000;
break;
case 11:
head_bit_rate=112000;
break;
case 12:
head_bit_rate=128000;
break;
case 13:
head_bit_rate=144000;
break;
case 14:
head_bit_rate=160000;
break;
default:
return false;
break;
}
break;
case 3:
switch(buffer[2]>>4) {
case 1:
head_bit_rate=8000;
break;
case 2:
head_bit_rate=16000;
break;
case 3:
head_bit_rate=24000;
break;
case 4:
head_bit_rate=32000;
break;
case 5:
head_bit_rate=40000;
break;
case 6:
head_bit_rate=48000;
break;
case 7:
head_bit_rate=56000;
break;
case 8:
head_bit_rate=64000;
break;
case 9:
head_bit_rate=80000;
break;
case 10:
head_bit_rate=96000;
break;
case 11:
head_bit_rate=112000;
break;
case 12:
head_bit_rate=128000;
break;
case 13:
head_bit_rate=144000;
break;
case 14:
head_bit_rate=160000;
break;
default:
return false;
break;
}
break;
}
break;
default:
return false;
}
//
// Sample Rate
//
switch((buffer[2]>>2)&0x03) {
case 0:
switch(mpeg_id) {
case RDWaveFile::Mpeg1:
samples_per_sec=44100;
break;
case RDWaveFile::Mpeg2:
samples_per_sec=22050;
break;
default:
break;
}
break;
case 1:
switch(mpeg_id) {
case RDWaveFile::Mpeg1:
samples_per_sec=48000;
break;
case RDWaveFile::Mpeg2:
samples_per_sec=24000;
break;
default:
break;
}
break;
case 2:
switch(mpeg_id) {
case RDWaveFile::Mpeg1:
samples_per_sec=32000;
break;
case RDWaveFile::Mpeg2:
samples_per_sec=16000;
break;
default:
break;
}
break;
default:
return false;
break;
}
//
// Mode
//
switch(buffer[3]>>6) {
case 0:
head_mode=ACM_MPEG_STEREO;
channels=2;
break;
case 1:
head_mode=ACM_MPEG_JOINTSTEREO;
channels=2;
break;
case 2:
head_mode=ACM_MPEG_DUALCHANNEL;
channels=2;
break;
case 3:
head_mode=ACM_MPEG_SINGLECHANNEL;
channels=1;
break;
}
//
// Flags
//
if((buffer[2]&0x01)!=0) {
head_flags|=ACM_MPEG_PRIVATEBIT;
}
if((buffer[3]&0x08)!=0) {
head_flags|=ACM_MPEG_COPYRIGHT;
}
if((buffer[3]&0x04)!=0) {
head_flags|=ACM_MPEG_ORIGINALHOME;
}
if((buffer[1]&0x01)!=0) {
head_flags|=ACM_MPEG_PROTECTIONBIT;
}
if(mpeg_id==RDWaveFile::Mpeg1) {
head_flags|=ACM_MPEG_ID_MPEG1;
}
//
// Frame Size (without padding)
//
mpeg_frame_size=144*head_bit_rate/samples_per_sec;
return true;
}
*/
int RDWaveFile::GetAtxOffset(int fd)
{
unsigned char buffer[MAX_ATX_HEADER_SIZE];