From 9fcd7aaab1e4fdaa5dd91aa5e4c4abfbccef866d Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Wed, 6 Oct 2021 14:03:07 -0400 Subject: [PATCH] 2021-10-06 Fred Gleason * 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 --- ChangeLog | 3 + lib/rdwavefile.cpp | 559 +-------------------------------------------- 2 files changed, 6 insertions(+), 556 deletions(-) diff --git a/ChangeLog b/ChangeLog index 151649b4..21929776 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22507,3 +22507,6 @@ 2021-10-06 Fred Gleason * Increased the import process timeout for the WebGet service to 1200 seconds. +2021-10-06 Fred Gleason + * Fixed an arithmetic overflow bug in 'RDWaveFile' that could + cause the play length of MPEG-encoded to be incorrectly calculated. diff --git a/lib/rdwavefile.cpp b/lib/rdwavefile.cpp index 7d2e89ce..82e22b74 100644 --- a/lib/rdwavefile.cpp +++ b/lib/rdwavefile.cpp @@ -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];