From 1ebbd65d643ee9976da833cb22b7791c156f76a6 Mon Sep 17 00:00:00 2001
From: Tristan Matthews <tristan.matthews@savoirfairelinux.com>
Date: Fri, 27 Apr 2012 13:18:18 -0400
Subject: [PATCH] * #100016: cleanup crypto contexts in audio_srtp_session

---
 .../src/audio/audiortp/audio_rtp_factory.cpp  |  6 ++++--
 .../src/audio/audiortp/audio_srtp_session.cpp | 19 +++++++++++++++----
 .../src/audio/audiortp/audio_srtp_session.h   |  4 ++++
 3 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/daemon/src/audio/audiortp/audio_rtp_factory.cpp b/daemon/src/audio/audiortp/audio_rtp_factory.cpp
index 2170b06e52..0eb046abe9 100644
--- a/daemon/src/audio/audiortp/audio_rtp_factory.cpp
+++ b/daemon/src/audio/audiortp/audio_rtp_factory.cpp
@@ -50,9 +50,11 @@ AudioRtpFactory::AudioRtpFactory(SIPCall *ca) : rtpSession_(NULL),
 
 AudioRtpFactory::~AudioRtpFactory()
 {
+    AudioSrtpSession* srtpSession = dynamic_cast<AudioSrtpSession*>(rtpSession_);
+    if (srtpSession)
+        srtpSession->deleteCryptoContexts();
+
     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 38567d1b62..630d3ce94c 100644
--- a/daemon/src/audio/audiortp/audio_srtp_session.cpp
+++ b/daemon/src/audio/audiortp/audio_srtp_session.cpp
@@ -306,12 +306,23 @@ void AudioSrtpSession::initializeLocalCryptoContext()
 void AudioSrtpSession::restoreCryptoContext(ost::CryptoContext *localContext,
                                             ost::CryptoContext *remoteContext)
 {
-    delete remoteCryptoCtx_;
-    remoteCryptoCtx_ = remoteContext;
-    delete localCryptoCtx_;
-    localCryptoCtx_ = localContext;
+    if (remoteCryptoCtx_ != remoteContext) {
+        delete remoteCryptoCtx_;
+        remoteCryptoCtx_ = remoteContext;
+    }
+    if (localCryptoCtx_ != localContext) {
+        delete localCryptoCtx_;
+        localCryptoCtx_ = localContext;
+    }
     setInQueueCryptoContext(remoteCryptoCtx_);
     setOutQueueCryptoContext(localCryptoCtx_);
 }
 
+void AudioSrtpSession::deleteCryptoContexts()
+{
+    delete remoteCryptoCtx_;
+    remoteCryptoCtx_ = 0;
+    delete localCryptoCtx_;
+    localCryptoCtx_ = 0;
+}
 }
diff --git a/daemon/src/audio/audiortp/audio_srtp_session.h b/daemon/src/audio/audiortp/audio_srtp_session.h
index a84cfccc84..733e0cfb22 100644
--- a/daemon/src/audio/audiortp/audio_srtp_session.h
+++ b/daemon/src/audio/audiortp/audio_srtp_session.h
@@ -101,6 +101,10 @@ class AudioSrtpSession : public AudioSymmetricRtpSession {
          */
         void restoreCryptoContext(ost::CryptoContext *, ost::CryptoContext *);
 
+        /**
+         * Force deletion of the current crypto contexts.
+         */
+        void deleteCryptoContexts();
     private:
         NON_COPYABLE(AudioSrtpSession);
 
-- 
GitLab