Fixing Coverity issues in Audio Coding Module

10198: Out-of-bounds read in acm_isac.cc
10251: Unintended sign extension in acm_resampler.cc
10273: Uninitialized pointer field in acm_amr.cc
10274: Uninitialized pointer field in acm_amrwb.cc
10275: Uninitialized scalar field in acm_dtmf_detection.cc
10276: Uninitialized pointer field in acm_g722.cc
10277: Uninitialized pointer field in acm_g7221.cc
10278: Uninitialized pointer field in acm_g7221c.cc
10279: Uninitialized pointer field in acm_g729.cc
10280: Uninitialized pointer field in acm_g7291.cc
10281: Uninitialized pointer scalar in acm_generic_codec.cc
10282: Uninitialized pointer field in acm_gsmfr.cc
10283: Uninitialized scalar field in acm_isac.cc
10284: Uninitialized pointer field in acm_opus.cc
10285: Uninitialized scalar field in acm_resampler.cc
10286: Uninitialized pointer field in acm_speex.cc
10287: Uninitialized scalar field in audio_coding_module_impl.cc
10581: Unintended sign extension in audio_coding_module_impl.cc

Additional change: removed unused function and member from ACMResampler.

Review URL: https://webrtc-codereview.appspot.com/343016

git-svn-id: http://webrtc.googlecode.com/svn/trunk@1471 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
tina.legrand@webrtc.org 2012-01-19 13:22:22 +00:00
parent dcdb744eee
commit d71a11c15e
18 changed files with 165 additions and 96 deletions

View File

@ -50,7 +50,13 @@
namespace webrtc { namespace webrtc {
#ifndef WEBRTC_CODEC_AMR #ifndef WEBRTC_CODEC_AMR
ACMAMR::ACMAMR(WebRtc_Word16 /* codecID */) { ACMAMR::ACMAMR(WebRtc_Word16 /* codecID */)
: _encoderInstPtr(NULL),
_decoderInstPtr(NULL),
_encodingMode(-1), // Invalid value.
_encodingRate(0), // Invalid value.
_encoderPackingFormat(AMRBandwidthEfficient),
_decoderPackingFormat(AMRBandwidthEfficient) {
return; return;
} }

View File

@ -47,7 +47,13 @@
namespace webrtc { namespace webrtc {
#ifndef WEBRTC_CODEC_AMRWB #ifndef WEBRTC_CODEC_AMRWB
ACMAMRwb::ACMAMRwb(WebRtc_Word16 /* codecID*/) { ACMAMRwb::ACMAMRwb(WebRtc_Word16 /* codecID*/)
: _encoderInstPtr(NULL),
_decoderInstPtr(NULL),
_encodingMode(-1), // invalid value
_encodingRate(0), // invalid value
_encoderPackingFormat(AMRBandwidthEfficient),
_decoderPackingFormat(AMRBandwidthEfficient) {
return; return;
} }

View File

@ -13,7 +13,8 @@
namespace webrtc { namespace webrtc {
ACMDTMFDetection::ACMDTMFDetection() {} ACMDTMFDetection::ACMDTMFDetection()
: _init(0) {}
ACMDTMFDetection::~ACMDTMFDetection() {} ACMDTMFDetection::~ACMDTMFDetection() {}

View File

@ -21,7 +21,12 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_G722 #ifndef WEBRTC_CODEC_G722
ACMG722::ACMG722(WebRtc_Word16 /* codecID */) { ACMG722::ACMG722(WebRtc_Word16 /* codecID */)
: _ptrEncStr(NULL),
_ptrDecStr(NULL),
_encoderInstPtr(NULL),
_encoderInstPtrRight(NULL),
_decoderInstPtr(NULL) {
return; return;
} }
@ -106,7 +111,10 @@ struct ACMG722DecStr {
G722DecInst* instRight; // instance for right channel in case of stereo G722DecInst* instRight; // instance for right channel in case of stereo
}; };
ACMG722::ACMG722(WebRtc_Word16 codecID) { ACMG722::ACMG722(WebRtc_Word16 codecID)
: _encoderInstPtr(NULL),
_encoderInstPtrRight(NULL),
_decoderInstPtr(NULL) {
// Encoder // Encoder
_ptrEncStr = new ACMG722EncStr; _ptrEncStr = new ACMG722EncStr;
if (_ptrEncStr != NULL) { if (_ptrEncStr != NULL) {

View File

@ -88,7 +88,20 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_G722_1 #ifndef WEBRTC_CODEC_G722_1
ACMG722_1::ACMG722_1(WebRtc_Word16 /* codecID */) { ACMG722_1::ACMG722_1(WebRtc_Word16 /* codecID */)
: _operationalRate(-1),
_encoderInstPtr(NULL),
_encoderInstPtrRight(NULL),
_decoderInstPtr(NULL),
_encoderInst16Ptr(NULL),
_encoderInst16PtrR(NULL),
_encoderInst24Ptr(NULL),
_encoderInst24PtrR(NULL),
_encoderInst32Ptr(NULL),
_encoderInst32PtrR(NULL),
_decoderInst16Ptr(NULL),
_decoderInst24Ptr(NULL),
_decoderInst32Ptr(NULL) {
return; return;
} }

View File

@ -88,8 +88,20 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_G722_1C #ifndef WEBRTC_CODEC_G722_1C
ACMG722_1C::ACMG722_1C( ACMG722_1C::ACMG722_1C(WebRtc_Word16 /* codecID */)
WebRtc_Word16 /* codecID */) { : _operationalRate(-1),
_encoderInstPtr(NULL),
_encoderInstPtrRight(NULL),
_decoderInstPtr(NULL),
_encoderInst24Ptr(NULL),
_encoderInst24PtrR(NULL),
_encoderInst32Ptr(NULL),
_encoderInst32PtrR(NULL),
_encoderInst48Ptr(NULL),
_encoderInst48PtrR(NULL),
_decoderInst24Ptr(NULL),
_decoderInst32Ptr(NULL),
_decoderInst48Ptr(NULL) {
return; return;
} }

View File

@ -42,10 +42,10 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_G729 #ifndef WEBRTC_CODEC_G729
ACMG729::ACMG729( ACMG729::ACMG729(WebRtc_Word16 /* codecID */)
WebRtc_Word16 /* codecID */) : _encoderInstPtr(NULL),
{ _decoderInstPtr(NULL) {
return; return;
} }

View File

@ -42,10 +42,10 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_G729_1 #ifndef WEBRTC_CODEC_G729_1
ACMG729_1::ACMG729_1( ACMG729_1::ACMG729_1( WebRtc_Word16 /* codecID */)
WebRtc_Word16 /* codecID */) : _encoderInstPtr(NULL),
{ _decoderInstPtr(NULL) {
return; return;
} }

View File

@ -40,9 +40,9 @@ ACMGenericCodec::ACMGenericCodec()
_inTimestampIxWrite(0), _inTimestampIxWrite(0),
_inAudio(NULL), _inAudio(NULL),
_inTimestamp(NULL), _inTimestamp(NULL),
_frameLenSmpl(-1), // invalid value _frameLenSmpl(-1), // invalid value
_noChannels(1), _noChannels(1),
_codecID(-1), // invalid value _codecID(-1), // invalid value
_noMissedSamples(0), _noMissedSamples(0),
_encoderExist(false), _encoderExist(false),
_decoderExist(false), _decoderExist(false),
@ -61,12 +61,22 @@ ACMGenericCodec::ACMGenericCodec()
_netEqDecodeLock(NULL), _netEqDecodeLock(NULL),
_codecWrapperLock(*RWLockWrapper::CreateRWLock()), _codecWrapperLock(*RWLockWrapper::CreateRWLock()),
_lastEncodedTimestamp(0), _lastEncodedTimestamp(0),
_lastTimestamp(0), _lastTimestamp(0xD87F3F9F),
_isAudioBuffFresh(true), _isAudioBuffFresh(true),
_uniqueID(0) { _uniqueID(0) {
_lastTimestamp = 0xD87F3F9F; // Initialize VAD vector.
//NullifyCodecInstance(); for (int i = 0; i < MAX_FRAME_SIZE_10MSEC; i++) {
_vadLabel[i] = 0;
}
// Nullify memory for encoder and decoder, and set payload type to an
// invalid value.
memset(&_encoderParams, 0, sizeof(WebRtcACMCodecParams));
_encoderParams.codecInstant.pltype = -1;
memset(&_decoderParams, 0, sizeof(WebRtcACMCodecParams));
_decoderParams.codecInstant.pltype = -1;
} }
ACMGenericCodec::~ACMGenericCodec() ACMGenericCodec::~ACMGenericCodec()
{ {
// Check all the members which are pointers and // Check all the members which are pointers and

View File

@ -42,10 +42,10 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_GSMFR #ifndef WEBRTC_CODEC_GSMFR
ACMGSMFR::ACMGSMFR( ACMGSMFR::ACMGSMFR(WebRtc_Word16 /* codecID */)
WebRtc_Word16 /* codecID */) : _encoderInstPtr(NULL),
{ _decoderInstPtr(NULL) {
return; return;
} }

View File

@ -24,10 +24,10 @@ namespace webrtc
#ifndef WEBRTC_CODEC_ILBC #ifndef WEBRTC_CODEC_ILBC
ACMILBC::ACMILBC( ACMILBC::ACMILBC(WebRtc_Word16 /* codecID */)
WebRtc_Word16 /* codecID */) : _encoderInstPtr(NULL),
{ _decoderInstPtr(NULL) {
return; return;
} }

View File

@ -86,10 +86,18 @@ const WebRtc_Word32 isacRatesSWB[NR_ISAC_BANDWIDTHS] =
#if (!defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX)) #if (!defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX))
ACMISAC::ACMISAC( ACMISAC::ACMISAC(WebRtc_Word16 /* codecID */)
WebRtc_Word16 /* codecID */) : _codecInstPtr(NULL),
{ _isEncInitialized(false),
return; _isacCodingMode(CHANNEL_INDEPENDENT),
_enforceFrameSize(false),
_isacCurrentBN(32000),
_samplesIn10MsAudio(160) { // Initiates to 16 kHz mode.
// Initiate decoder parameters for the 32 kHz mode.
memset(&_decoderParams32kHz, 0, sizeof(WebRtcACMCodecParams));
_decoderParams32kHz.codecInstant.pltype = -1;
return;
} }
@ -453,24 +461,29 @@ ACMISACFixGetDecSampRate(
ACMISAC::ACMISAC( ACMISAC::ACMISAC(WebRtc_Word16 codecID)
WebRtc_Word16 codecID): : _isEncInitialized(false),
_codecInstPtr(NULL) _isacCodingMode(CHANNEL_INDEPENDENT),
{ _enforceFrameSize(false),
_codecInstPtr = new ACMISACInst; _isacCurrentBN(32000),
if (_codecInstPtr == NULL) _samplesIn10MsAudio(160) { // Initiates to 16 kHz mode.
{ _codecID = codecID;
return;
}
_codecInstPtr->inst = NULL;
_codecID = codecID;
_enforceFrameSize = false;
// by default a 16 kHz iSAC is created.
_samplesIn10MsAudio = 160;
// Initialize values that can be used uninitialized otherwise // Create codec instance.
_decoderParams.codecInstant.pltype = -1; _codecInstPtr = new ACMISACInst;
_decoderParams32kHz.codecInstant.pltype = -1; if (_codecInstPtr == NULL) {
return;
}
_codecInstPtr->inst = NULL;
// Initiate decoder parameters for the 32 kHz mode.
memset(&_decoderParams32kHz, 0, sizeof(WebRtcACMCodecParams));
_decoderParams32kHz.codecInstant.pltype = -1;
// TODO(tlegrand): Check if the following is really needed, now that
// ACMGenericCodec has been updated to initialize this value.
// Initialize values that can be used uninitialized otherwise
_decoderParams.codecInstant.pltype = -1;
} }
@ -893,7 +906,7 @@ ACMISAC::GetEstimatedBandwidthSafe()
ACM_ISAC_GETSENDBWE(_codecInstPtr->inst, &bandwidthIndex, &delayIndex); ACM_ISAC_GETSENDBWE(_codecInstPtr->inst, &bandwidthIndex, &delayIndex);
// Validy check of index // Validy check of index
if ((bandwidthIndex < 0) || (bandwidthIndex > NR_ISAC_BANDWIDTHS)) if ((bandwidthIndex < 0) || (bandwidthIndex >= NR_ISAC_BANDWIDTHS))
{ {
return -1; return -1;
} }

View File

@ -26,10 +26,14 @@ namespace webrtc
#ifndef WEBRTC_CODEC_OPUS #ifndef WEBRTC_CODEC_OPUS
ACMOPUS::ACMOPUS( ACMOPUS::ACMOPUS(WebRtc_Word16 /* codecID */)
WebRtc_Word16 /* codecID */) : _encoderInstPtr(NULL),
{ _decoderInstPtr(NULL),
return; _mySampFreq(0),
_myRate(0),
_opusMode(0),
_flagVBR(0) {
return;
} }
@ -164,25 +168,19 @@ extern WebRtc_Word16 WebRtcOpus_DecodeBwe(OPUS_inst_t_* decInst, WebRtc_Word16*
extern WebRtc_Word16 WebRtcOpus_DecodePlc(OPUS_inst_t_* decInst); extern WebRtc_Word16 WebRtcOpus_DecodePlc(OPUS_inst_t_* decInst);
extern WebRtc_Word16 WebRtcOpus_DecoderInit(OPUS_inst_t_* decInst); extern WebRtc_Word16 WebRtcOpus_DecoderInit(OPUS_inst_t_* decInst);
ACMOPUS::ACMOPUS( ACMOPUS::ACMOPUS(WebRtc_Word16 codecID)
WebRtc_Word16 codecID): : _encoderInstPtr(NULL),
_encoderInstPtr(NULL), _decoderInstPtr(NULL),
_decoderInstPtr(NULL), _mySampFreq(48000), // Default sampling frequency.
_opusMode(1), // default mode is the hybrid mode _myRate(50000), // Default rate.
_flagVBR(0) // default VBR off _opusMode(1), // Default mode is the hybrid mode.
{ _flagVBR(0) { // Default VBR off.
_codecID = codecID; _codecID = codecID;
// Current implementation doesn't have DTX. That might change. // Current implementation doesn't have DTX. That might change.
_hasInternalDTX = false; _hasInternalDTX = false;
// Default sampling frequency return;
_mySampFreq = 48000;
// default rate
_myRate = 50000;
return;
} }
ACMOPUS::~ACMOPUS() ACMOPUS::~ACMOPUS()

View File

@ -45,8 +45,9 @@ ACMResampler::Resample10Msec(
if(inFreqHz == outFreqHz) if(inFreqHz == outFreqHz)
{ {
memcpy(outAudio, inAudio, (inFreqHz*numAudioChannels / 100) * sizeof(WebRtc_Word16)); size_t length = static_cast<size_t>(inFreqHz * numAudioChannels / 100);
return (WebRtc_Word16)(inFreqHz / 100); memcpy(outAudio, inAudio, length * sizeof(WebRtc_Word16));
return static_cast<WebRtc_Word16>(inFreqHz / 100);
} }
int maxLen = 480 * numAudioChannels; //max number of samples for 10ms at 48kHz int maxLen = 480 * numAudioChannels; //max number of samples for 10ms at 48kHz
@ -60,7 +61,7 @@ ACMResampler::Resample10Msec(
ret = _resampler.ResetIfNeeded(inFreqHz,outFreqHz,type); ret = _resampler.ResetIfNeeded(inFreqHz,outFreqHz,type);
if (ret < 0) if (ret < 0)
{ {
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _id, WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, 0,
"Error in reset of resampler"); "Error in reset of resampler");
return -1; return -1;
} }
@ -68,7 +69,7 @@ ACMResampler::Resample10Msec(
ret = _resampler.Push(inAudio, lengthIn, outAudio, maxLen, outLen); ret = _resampler.Push(inAudio, lengthIn, outAudio, maxLen, outLen);
if (ret < 0 ) if (ret < 0 )
{ {
WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, _id, WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, 0,
"Error in resampler: resampler.Push"); "Error in resampler: resampler.Push");
return -1; return -1;
} }
@ -79,12 +80,4 @@ ACMResampler::Resample10Msec(
} }
void
ACMResampler::SetUniqueId(
WebRtc_Word32 id)
{
CriticalSectionScoped lock(_resamplerCritSect);
_id = id;
}
} // namespace webrtc } // namespace webrtc

View File

@ -31,14 +31,10 @@ public:
const WebRtc_Word32 outFreqHz, const WebRtc_Word32 outFreqHz,
WebRtc_UWord8 numAudioChannels); WebRtc_UWord8 numAudioChannels);
void SetUniqueId(
WebRtc_Word32 id);
private: private:
//Use the Resampler class //Use the Resampler class
Resampler _resampler; Resampler _resampler;
WebRtc_Word32 _id;
CriticalSectionWrapper& _resamplerCritSect; CriticalSectionWrapper& _resamplerCritSect;
}; };

View File

@ -53,8 +53,9 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_SPEEX #ifndef WEBRTC_CODEC_SPEEX
ACMSPEEX::ACMSPEEX(WebRtc_Word16 /* codecID*/) ACMSPEEX::ACMSPEEX(WebRtc_Word16 /* codecID*/)
{ : _encoderInstPtr(NULL),
return; _decoderInstPtr(NULL) {
return;
} }
ACMSPEEX::~ACMSPEEX() ACMSPEEX::~ACMSPEEX()

View File

@ -65,9 +65,11 @@ AudioCodingModuleImpl::AudioCodingModuleImpl(
_fecEnabled(false), _fecEnabled(false),
_fragmentation(NULL), _fragmentation(NULL),
_lastFECTimestamp(0), _lastFECTimestamp(0),
_redPayloadType(255),
_receiveREDPayloadType(255), // invalid value _receiveREDPayloadType(255), // invalid value
_previousPayloadType(255), _previousPayloadType(255),
_dummyRTPHeader(NULL), _dummyRTPHeader(NULL),
_recvPlFrameSizeSmpls(0),
_receiverInitialized(false), _receiverInitialized(false),
_dtmfDetector(NULL), _dtmfDetector(NULL),
_dtmfCallback(NULL), _dtmfCallback(NULL),
@ -76,8 +78,19 @@ AudioCodingModuleImpl::AudioCodingModuleImpl(
{ {
_lastTimestamp = 0xD87F3F9F; _lastTimestamp = 0xD87F3F9F;
_lastInTimestamp = 0xD87F3F9F; _lastInTimestamp = 0xD87F3F9F;
// nullify the codec name
// Nullify send codec memory, set payload type and set codec name to
// invalid values.
memset(&_sendCodecInst, 0, sizeof(CodecInst));
strncpy(_sendCodecInst.plname, "noCodecRegistered", 31); strncpy(_sendCodecInst.plname, "noCodecRegistered", 31);
_sendCodecInst.pltype = -1;
// Nullify memory for CNG, DTMF and RED.
memset(&_cngNB, 0, sizeof(CodecInst));
memset(&_cngWB, 0, sizeof(CodecInst));
memset(&_cngSWB, 0, sizeof(CodecInst));
memset(&_RED, 0, sizeof(CodecInst));
memset(&_DTMF, 0, sizeof(CodecInst));
for (int i = 0; i < ACMCodecDB::kMaxNumCodecs; i++) for (int i = 0; i < ACMCodecDB::kMaxNumCodecs; i++)
{ {
@ -1177,9 +1190,10 @@ match");
} }
} else { } else {
// Copy payload data for future use. // Copy payload data for future use.
memcpy(audio, audioFrame._payloadData, size_t length = static_cast<size_t>(
audioFrame._payloadDataLengthInSamples * audio_channels * audioFrame._payloadDataLengthInSamples * audio_channels *
sizeof(WebRtc_UWord16)); sizeof(WebRtc_UWord16));
memcpy(audio, audioFrame._payloadData, length);
} }
WebRtc_UWord32 currentTimestamp; WebRtc_UWord32 currentTimestamp;

View File

@ -315,9 +315,7 @@ private:
CodecInst _cngWB; CodecInst _cngWB;
CodecInst _cngSWB; CodecInst _cngSWB;
CodecInst _RED; CodecInst _RED;
bool _REDRegistered;
CodecInst _DTMF; CodecInst _DTMF;
bool _DTMFRegistered;
bool _vadEnabled; bool _vadEnabled;
bool _dtxEnabled; bool _dtxEnabled;
ACMVADMode _vadMode; ACMVADMode _vadMode;