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 {
#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;
}

View File

@ -47,7 +47,13 @@
namespace webrtc {
#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;
}

View File

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

View File

@ -21,7 +21,12 @@ namespace webrtc {
#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;
}
@ -106,7 +111,10 @@ struct ACMG722DecStr {
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
_ptrEncStr = new ACMG722EncStr;
if (_ptrEncStr != NULL) {

View File

@ -88,7 +88,20 @@ namespace webrtc {
#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;
}

View File

@ -88,8 +88,20 @@ namespace webrtc {
#ifndef WEBRTC_CODEC_G722_1C
ACMG722_1C::ACMG722_1C(
WebRtc_Word16 /* codecID */) {
ACMG722_1C::ACMG722_1C(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;
}

View File

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

View File

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

View File

@ -61,12 +61,22 @@ ACMGenericCodec::ACMGenericCodec()
_netEqDecodeLock(NULL),
_codecWrapperLock(*RWLockWrapper::CreateRWLock()),
_lastEncodedTimestamp(0),
_lastTimestamp(0),
_lastTimestamp(0xD87F3F9F),
_isAudioBuffFresh(true),
_uniqueID(0) {
_lastTimestamp = 0xD87F3F9F;
//NullifyCodecInstance();
// Initialize VAD vector.
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()
{
// Check all the members which are pointers and

View File

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

View File

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

View File

@ -86,9 +86,17 @@ const WebRtc_Word32 isacRatesSWB[NR_ISAC_BANDWIDTHS] =
#if (!defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX))
ACMISAC::ACMISAC(
WebRtc_Word16 /* codecID */)
{
ACMISAC::ACMISAC(WebRtc_Word16 /* codecID */)
: _codecInstPtr(NULL),
_isEncInitialized(false),
_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(
WebRtc_Word16 codecID):
_codecInstPtr(NULL)
{
ACMISAC::ACMISAC(WebRtc_Word16 codecID)
: _isEncInitialized(false),
_isacCodingMode(CHANNEL_INDEPENDENT),
_enforceFrameSize(false),
_isacCurrentBN(32000),
_samplesIn10MsAudio(160) { // Initiates to 16 kHz mode.
_codecID = codecID;
// Create codec instance.
_codecInstPtr = new ACMISACInst;
if (_codecInstPtr == NULL)
{
if (_codecInstPtr == NULL) {
return;
}
_codecInstPtr->inst = NULL;
_codecID = codecID;
_enforceFrameSize = false;
// by default a 16 kHz iSAC is created.
_samplesIn10MsAudio = 160;
// 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;
_decoderParams32kHz.codecInstant.pltype = -1;
}
@ -893,7 +906,7 @@ ACMISAC::GetEstimatedBandwidthSafe()
ACM_ISAC_GETSENDBWE(_codecInstPtr->inst, &bandwidthIndex, &delayIndex);
// Validy check of index
if ((bandwidthIndex < 0) || (bandwidthIndex > NR_ISAC_BANDWIDTHS))
if ((bandwidthIndex < 0) || (bandwidthIndex >= NR_ISAC_BANDWIDTHS))
{
return -1;
}

View File

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

View File

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

View File

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

View File

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

View File

@ -65,9 +65,11 @@ AudioCodingModuleImpl::AudioCodingModuleImpl(
_fecEnabled(false),
_fragmentation(NULL),
_lastFECTimestamp(0),
_redPayloadType(255),
_receiveREDPayloadType(255), // invalid value
_previousPayloadType(255),
_dummyRTPHeader(NULL),
_recvPlFrameSizeSmpls(0),
_receiverInitialized(false),
_dtmfDetector(NULL),
_dtmfCallback(NULL),
@ -76,8 +78,19 @@ AudioCodingModuleImpl::AudioCodingModuleImpl(
{
_lastTimestamp = 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);
_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++)
{
@ -1177,9 +1190,10 @@ match");
}
} else {
// Copy payload data for future use.
memcpy(audio, audioFrame._payloadData,
size_t length = static_cast<size_t>(
audioFrame._payloadDataLengthInSamples * audio_channels *
sizeof(WebRtc_UWord16));
memcpy(audio, audioFrame._payloadData, length);
}
WebRtc_UWord32 currentTimestamp;

View File

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