From 1caa5c05855bc01d86546cbb18151e66960bd086 Mon Sep 17 00:00:00 2001
From: Lyubomir Marinov <lyubomir.marinov@jitsi.org>
Date: Sat, 12 Apr 2014 23:34:41 +0300
Subject: [PATCH] Fixes memory leaks.

---
 .../transform/dtls/DtlsPacketTransformer.java     |  9 ++++++---
 .../transform/dtls/DtlsTransformEngine.java       | 12 +++++++++++-
 .../transform/zrtp/ZRTPTransformEngine.java       | 15 ++++++++++++++-
 3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java
index 8d1f0656..c4fecd44 100644
--- a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java
+++ b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java
@@ -227,10 +227,13 @@ private void closeDatagramTransport()
      * to try to establish a DTLS connection.
      *
      * @param i the number of tries remaining after the current one
+     * @param datagramTransport
      * @return <tt>true</tt> to try to establish a DTLS connection; otherwise,
      * <tt>false</tt>
      */
-    private boolean enterRunInConnectThreadLoop(int i)
+    private boolean enterRunInConnectThreadLoop(
+            int i,
+            DatagramTransport datagramTransport)
     {
         if ((i < 0) || (i > CONNECT_TRIES))
         {
@@ -654,7 +657,7 @@ private void runInConnectThread(
 
             for (int i = CONNECT_TRIES - 1; i >= 0; i--)
             {
-                if (!enterRunInConnectThreadLoop(i))
+                if (!enterRunInConnectThreadLoop(i, datagramTransport))
                     break;
                 try
                 {
@@ -694,7 +697,7 @@ else if (dtlsProtocol instanceof DTLSServerProtocol)
 
             for (int i = CONNECT_TRIES - 1; i >= 0; i--)
             {
-                if (!enterRunInConnectThreadLoop(i))
+                if (!enterRunInConnectThreadLoop(i, datagramTransport))
                     break;
                 try
                 {
diff --git a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java
index 30fada3d..fa146a37 100644
--- a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java
@@ -25,6 +25,13 @@ public class DtlsTransformEngine
      */
     private AbstractRTPConnector connector;
 
+    /**
+     * The indicator which determines whether
+     * {@link SrtpControl.TransformEngine#cleanup()} has been invoked on this
+     * instance to prepare it for garbage collection.
+     */
+    private boolean disposed = false;
+
     /**
      * The <tt>DtlsControl</tt> which has initialized this instance.
      */
@@ -62,8 +69,11 @@ public DtlsTransformEngine(DtlsControlImpl dtlsControl)
     /**
      * {@inheritDoc}
      */
+    @Override
     public void cleanup()
     {
+        disposed = true;
+
         for (int i = 0; i < packetTransformers.length; i++)
         {
             DtlsPacketTransformer packetTransformer = packetTransformers[i];
@@ -123,7 +133,7 @@ private DtlsPacketTransformer getPacketTransformer(int componentID)
         int index = componentID - 1;
         DtlsPacketTransformer packetTransformer = packetTransformers[index];
 
-        if (packetTransformer == null)
+        if ((packetTransformer == null) && !disposed)
         {
             packetTransformer = createPacketTransformer(componentID);
             if (packetTransformer != null)
diff --git a/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java
index 4991b925..292975f7 100644
--- a/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java
+++ b/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java
@@ -396,6 +396,16 @@ public void run()
      */
     private long zrtpUnprotect;
 
+    /**
+     * The indicator which determines whether
+     * {@link SrtpControl.TransformEngine#cleanup()} has been invoked on this
+     * instance to prepare it for garbage collection. Disallows
+     * {@link #getRTCPTransformer()} to initialize a new
+     * <tt>ZRTCPTransformer</tt> instance which cannot possibly be correctly
+     * used after the disposal of this instance anyway.
+     */
+    private boolean disposed = false;
+
     /**
      * Construct a ZRTPTransformEngine.
      *
@@ -418,7 +428,7 @@ public ZRTPTransformEngine()
      */
     public ZRTCPTransformer getRTCPTransformer()
     {
-        if(zrtcpTransformer == null)
+        if ((zrtcpTransformer == null) && !disposed)
             zrtcpTransformer = new ZRTCPTransformer();
         return zrtcpTransformer;
     }
@@ -670,8 +680,11 @@ public void stopZrtp()
     /**
      * Cleanup function for any remaining timers
      */
+    @Override
     public void cleanup()
     {
+        disposed = true;
+
         stopZrtp();
 
         if (timeoutProvider != null)
-- 
GitLab