diff --git a/daemon/src/audio/audiortp/audio_rtp_factory.cpp b/daemon/src/audio/audiortp/audio_rtp_factory.cpp index 2170b06e52a77e238fa1c4241ec4cc4bac363218..4747834738279838373248fd141c762bbfbafd5b 100644 --- a/daemon/src/audio/audiortp/audio_rtp_factory.cpp +++ b/daemon/src/audio/audiortp/audio_rtp_factory.cpp @@ -51,8 +51,6 @@ AudioRtpFactory::AudioRtpFactory(SIPCall *ca) : rtpSession_(NULL), AudioRtpFactory::~AudioRtpFactory() { delete rtpSession_; - delete cachedLocalContext_; - delete cachedRemoteContext_; } void AudioRtpFactory::initConfig() diff --git a/daemon/src/audio/audiortp/audio_srtp_session.cpp b/daemon/src/audio/audiortp/audio_srtp_session.cpp index 38567d1b629cdbe7dbc29971401039429b9b3cc3..f08b570af2443f38f67a1d2a7941eaf2496d61ed 100644 --- a/daemon/src/audio/audiortp/audio_srtp_session.cpp +++ b/daemon/src/audio/audiortp/audio_srtp_session.cpp @@ -158,7 +158,7 @@ std::vector<std::string> AudioSrtpSession::getLocalCryptoInfo() // cryptographic context tagged 1, 2, 3... std::string tag = "1"; - std::string crypto_suite = sfl::CryptoSuites[localCryptoSuite_].name; + std::string crypto_suite(sfl::CryptoSuites[localCryptoSuite_].name); // srtp keys formated as the following as the following // inline:keyParameters|keylifetime|MasterKeyIdentifier @@ -262,9 +262,10 @@ void AudioSrtpSession::initializeRemoteCryptoContext() { DEBUG("AudioSrtp: Initialize remote crypto context"); - CryptoSuiteDefinition crypto = sfl::CryptoSuites[remoteCryptoSuite_]; + const CryptoSuiteDefinition &crypto = sfl::CryptoSuites[remoteCryptoSuite_]; - delete remoteCryptoCtx_; + // delete this crypto context from the internal map + removeInQueueCryptoContext(remoteCryptoCtx_); remoteCryptoCtx_ = new ost::CryptoContext(0x0, 0, // roc, 0L, // keydr, @@ -285,9 +286,10 @@ void AudioSrtpSession::initializeLocalCryptoContext() { DEBUG("AudioSrtp: Initialize local crypto context"); - CryptoSuiteDefinition crypto = sfl::CryptoSuites[localCryptoSuite_]; + const CryptoSuiteDefinition &crypto = sfl::CryptoSuites[localCryptoSuite_]; - delete localCryptoCtx_; + // delete this crypto context from the internal map + removeOutQueueCryptoContext(localCryptoCtx_); localCryptoCtx_ = new ost::CryptoContext(OutgoingDataQueue::getLocalSSRC(), 0, // roc, 0L, // keydr, @@ -306,12 +308,16 @@ void AudioSrtpSession::initializeLocalCryptoContext() void AudioSrtpSession::restoreCryptoContext(ost::CryptoContext *localContext, ost::CryptoContext *remoteContext) { - delete remoteCryptoCtx_; - remoteCryptoCtx_ = remoteContext; - delete localCryptoCtx_; - localCryptoCtx_ = localContext; - setInQueueCryptoContext(remoteCryptoCtx_); - setOutQueueCryptoContext(localCryptoCtx_); + if (remoteCryptoCtx_ != remoteContext) { + removeInQueueCryptoContext(remoteCryptoCtx_); + remoteCryptoCtx_ = remoteContext; + setInQueueCryptoContext(remoteCryptoCtx_); + } + if (localCryptoCtx_ != localContext) { + removeOutQueueCryptoContext(localCryptoCtx_); + localCryptoCtx_ = localContext; + setOutQueueCryptoContext(localCryptoCtx_); + } } } diff --git a/daemon/src/audio/pulseaudio/pulselayer.cpp b/daemon/src/audio/pulseaudio/pulselayer.cpp index a930f5a10997ec6684ee6f9662365607c9508b14..ec672a8ba6754af53cf68731cc18bdae1ddbd8fe 100644 --- a/daemon/src/audio/pulseaudio/pulselayer.cpp +++ b/daemon/src/audio/pulseaudio/pulselayer.cpp @@ -398,7 +398,7 @@ void PulseLayer::readFromMic() size_t bytes; if (pa_stream_peek(record_->pulseStream() , (const void**) &data , &bytes) < 0 or !data) { - ERROR("Audio: Error capture stream peek failed: %s" , pa_strerror(pa_context_errno(context_))); + // ERROR("Audio: Error capture stream peek failed: %s" , pa_strerror(pa_context_errno(context_))); return; } diff --git a/daemon/src/sip/sdes_negotiator.cpp b/daemon/src/sip/sdes_negotiator.cpp index a8eed12a7dc671daaef40ff38a78b0e962ab01ab..8bf4cc12db3a1905f37f7771f02343dc1a4bd7ca 100644 --- a/daemon/src/sip/sdes_negotiator.cpp +++ b/daemon/src/sip/sdes_negotiator.cpp @@ -91,7 +91,6 @@ std::vector<CryptoAttribute *> SdesNegotiator::parse() // Take each line from the vector // and parse its content - std::vector<CryptoAttribute *> cryptoAttributeVector; for (std::vector<std::string>::iterator iter = remoteAttribute_.begin(); @@ -174,8 +173,7 @@ std::vector<CryptoAttribute *> SdesNegotiator::parse() bool SdesNegotiator::negotiate() { - - std::vector<CryptoAttribute *> cryptoAttributeVector = parse(); + std::vector<CryptoAttribute *> cryptoAttributeVector(parse()); std::vector<CryptoAttribute *>::iterator iter_offer = cryptoAttributeVector.begin(); std::vector<CryptoSuiteDefinition>::const_iterator iter_local = localCapabilities_.begin(); @@ -194,7 +192,7 @@ bool SdesNegotiator::negotiate() cryptoSuite_ = (*iter_offer)->getCryptoSuite(); srtpKeyMethod_ = (*iter_offer)->getSrtpKeyMethod(); srtpKeyInfo_ = (*iter_offer)->getSrtpKeyInfo(); - authTagLength_ = cryptoSuite_.substr(cryptoSuite_.size()-2, 2); + authTagLength_ = cryptoSuite_.substr(cryptoSuite_.size() - 2, 2); } ++iter_local; diff --git a/daemon/src/sip/sdes_negotiator.h b/daemon/src/sip/sdes_negotiator.h index 416f940b011eecd97d00e196a44e07cb146e688f..c6d575da1d224ded4fe91c0735b2b84081f6eba1 100644 --- a/daemon/src/sip/sdes_negotiator.h +++ b/daemon/src/sip/sdes_negotiator.h @@ -62,7 +62,7 @@ enum KeyMethod { }; struct CryptoSuiteDefinition { - char * name; + const char *name; int masterKeyLength; int masterSaltLength; int srtpLifetime; @@ -81,9 +81,9 @@ struct CryptoSuiteDefinition { * as defined in RFC4568 (6.2) */ static const CryptoSuiteDefinition CryptoSuites[] = { - { (char*) "AES_CM_128_HMAC_SHA1_80", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 80, 80, 160, 160 }, - { (char*) "AES_CM_128_HMAC_SHA1_32", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 32, 80, 160, 160 }, - { (char*) "F8_128_HMAC_SHA1_80", 128, 112, 48, 31, AESF8Mode, 128, HMACSHA1, 80, 80, 160, 160 } + { "AES_CM_128_HMAC_SHA1_80", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 80, 80, 160, 160 }, + { "AES_CM_128_HMAC_SHA1_32", 128, 112, 48, 31, AESCounterMode, 128, HMACSHA1, 32, 80, 160, 160 }, + { "F8_128_HMAC_SHA1_80", 128, 112, 48, 31, AESF8Mode, 128, HMACSHA1, 80, 80, 160, 160 } }; diff --git a/daemon/src/sip/sdp.cpp b/daemon/src/sip/sdp.cpp index 8fa3010bc0075fe67be38fd585440987b8fd2cc3..76ab9c86221538b29d54980b3f63c2bfb293096a 100644 --- a/daemon/src/sip/sdp.cpp +++ b/daemon/src/sip/sdp.cpp @@ -401,8 +401,6 @@ void Sdp::setMediaTransportInfoFromRemoteSdp() void Sdp::getRemoteSdpCryptoFromOffer(const pjmedia_sdp_session* remote_sdp, CryptoOffer& crypto_offer) { - CryptoOffer remoteOffer; - for (unsigned i = 0; i < remote_sdp->media_count; ++i) { pjmedia_sdp_media *media = remote_sdp->media[i]; diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index 1dc9c62250745c6e30371bd2f5ac8f2954b8f2dd..6df415e3ffa0d09c3fd3056d78e64367c5d5429a 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -38,6 +38,7 @@ #include "sip_utils.h" #include "sipvoiplink.h" +#include "array_size.h" #include "manager.h" #include "logger.h" @@ -1329,9 +1330,6 @@ void sdp_create_offer_cb(pjsip_inv_session *inv, pjmedia_sdp_session **p_offer) // This callback is called after SDP offer/answer session has completed. void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status) { - const pjmedia_sdp_session *remote_sdp; - const pjmedia_sdp_session *local_sdp; - SIPCall *call = static_cast<SIPCall *>(inv->mod_data[mod_ua_.id]); if (call == NULL) { @@ -1355,17 +1353,19 @@ void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status) Sdp *sdpSession = call->getLocalSDP(); // Get active session sessions + const pjmedia_sdp_session *remote_sdp; pjmedia_sdp_neg_get_active_remote(inv->neg, &remote_sdp); + const pjmedia_sdp_session *local_sdp; pjmedia_sdp_neg_get_active_local(inv->neg, &local_sdp); // Print SDP session char buffer[1000]; memset(buffer, 0, sizeof buffer); - pjmedia_sdp_print(remote_sdp, buffer, 1000); + pjmedia_sdp_print(remote_sdp, buffer, sizeof buffer); DEBUG("SDP: Remote active SDP Session:\n%s", buffer); - memset(buffer, 0, 1000); - pjmedia_sdp_print(local_sdp, buffer, 1000); + memset(buffer, 0, sizeof buffer); + pjmedia_sdp_print(local_sdp, buffer, sizeof buffer); DEBUG("SDP: Local active SDP Session:\n%s", buffer); // Set active SDP sessions @@ -1385,9 +1385,9 @@ void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status) bool nego_success = false; if (!crypto_offer.empty()) { - std::vector<sfl::CryptoSuiteDefinition>localCapabilities; + std::vector<sfl::CryptoSuiteDefinition> localCapabilities; - for (int i = 0; i < 3; i++) + for (size_t i = 0; i < ARRAYSIZE(sfl::CryptoSuites); ++i) localCapabilities.push_back(sfl::CryptoSuites[i]); sfl::SdesNegotiator sdesnego(localCapabilities, crypto_offer); @@ -1402,9 +1402,13 @@ void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status) Manager::instance().getDbusManager()->getCallManager()->secureSdesOn(call->getCallId()); } else { + ERROR("UserAgent: SDES negotiation failure"); Manager::instance().getDbusManager()->getCallManager()->secureSdesOff(call->getCallId()); } } + else { + DEBUG("UserAgent: No crypto offer available"); + } // We did not find any crypto context for this media, RTP fallback if (!nego_success && call->getAudioRtp().isSdesEnabled()) {