[vlc-commits] chromecast: fix TLS connection leak on error

Ludovic Fauvet git at videolan.org
Mon Oct 6 15:45:25 CEST 2014


vlc | branch: master | Ludovic Fauvet <etix at videolan.org> | Mon Oct  6 15:36:15 2014 +0200| [35738e89a5c76b33ae1af9f3e17273b341cf7322] | committer: Ludovic Fauvet

chromecast: fix TLS connection leak on error

Signed-off-by: Adrien Maglo <magsoft at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=35738e89a5c76b33ae1af9f3e17273b341cf7322
---

 modules/stream_out/chromecast/cast.cpp |   34 ++++++++++++++++----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/modules/stream_out/chromecast/cast.cpp b/modules/stream_out/chromecast/cast.cpp
index efd9c0f..b0e4166 100644
--- a/modules/stream_out/chromecast/cast.cpp
+++ b/modules/stream_out/chromecast/cast.cpp
@@ -69,7 +69,7 @@ enum
 struct sout_stream_sys_t
 {
     sout_stream_sys_t()
-        : i_status(CHROMECAST_DISCONNECTED), p_out(NULL)
+        : p_tls(NULL), i_status(CHROMECAST_DISCONNECTED), p_out(NULL)
     {
         atomic_init(&ab_error, false);
     }
@@ -115,7 +115,7 @@ struct sout_stream_sys_t
  *****************************************************************************/
 static int Open(vlc_object_t *);
 static void Close(vlc_object_t *);
-static void Clean(sout_stream_sys_t *p_sys);
+static void Clean(sout_stream_t *p_stream);
 static int connectChromecast(sout_stream_t *p_stream, char *psz_ipChromecast);
 static void disconnectChromecast(sout_stream_t *p_stream);
 static int sendMessages(sout_stream_t *p_stream);
@@ -213,7 +213,7 @@ static int Open(vlc_object_t *p_this)
     if (psz_ipChromecast == NULL)
     {
         msg_Err(p_stream, "No Chromecast receiver IP provided");
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
 
@@ -222,7 +222,7 @@ static int Open(vlc_object_t *p_this)
     if (p_sys->i_sock_fd < 0)
     {
         msg_Err(p_stream, "Could not connect the Chromecast");
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
     p_sys->i_status = CHROMECAST_TLS_CONNECTED;
@@ -231,7 +231,7 @@ static int Open(vlc_object_t *p_this)
     if (net_GetSockAddress(p_sys->i_sock_fd, psz_localIP, NULL))
     {
         msg_Err(p_this, "Cannot get local IP address");
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
     p_sys->serverIP = psz_localIP;
@@ -239,7 +239,7 @@ static int Open(vlc_object_t *p_this)
     char *psz_mux = var_GetNonEmptyString(p_stream, SOUT_CFG_PREFIX "mux");
     if (psz_mux == NULL)
     {
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
     char *psz_chain = NULL;
@@ -249,7 +249,7 @@ static int Open(vlc_object_t *p_this)
     free(psz_mux);
     if (i_bytes < 0)
     {
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
 
@@ -257,7 +257,7 @@ static int Open(vlc_object_t *p_this)
     free(psz_chain);
     if (p_sys->p_out == NULL)
     {
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
 
@@ -269,7 +269,7 @@ static int Open(vlc_object_t *p_this)
                   VLC_THREAD_PRIORITY_LOW))
     {
         msg_Err(p_stream, "Could not start the Chromecast talking thread");
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
 
@@ -290,7 +290,7 @@ static int Open(vlc_object_t *p_this)
         msg_Err(p_stream, "Timeout reached before sending the media loading command");
         vlc_cancel(p_sys->chromecastThread);
         vlc_join(p_sys->chromecastThread, NULL);
-        Clean(p_sys);
+        Clean(p_stream);
         return VLC_EGENERIC;
     }
 
@@ -330,24 +330,21 @@ static void Close(vlc_object_t *p_this)
         // Send the just added close messages.
         sendMessages(p_stream);
         // ft
-    case CHROMECAST_TLS_CONNECTED:
-    case CHROMECAST_CONNECTION_DEAD:
-        disconnectChromecast(p_stream);
-        p_sys->i_status = CHROMECAST_DISCONNECTED;
-        // ft
     default:
         break;
     }
 
-    Clean(p_sys);
+    Clean(p_stream);
 }
 
 
 /**
  * @brief Clean and release the variables in a sout_stream_sys_t structure
  */
-static void Clean(sout_stream_sys_t *p_sys)
+static void Clean(sout_stream_t *p_stream)
 {
+    sout_stream_sys_t *p_sys = p_stream->p_sys;
+
     if (p_sys->p_out)
     {
         vlc_mutex_destroy(&p_sys->lock);
@@ -355,6 +352,8 @@ static void Clean(sout_stream_sys_t *p_sys)
         sout_StreamChainDelete(p_sys->p_out, p_sys->p_out);
     }
 
+    disconnectChromecast(p_stream);
+
     delete p_sys;
 }
 
@@ -400,6 +399,7 @@ static void disconnectChromecast(sout_stream_t *p_stream)
         vlc_tls_SessionDelete(p_sys->p_tls);
         vlc_tls_Delete(p_sys->p_creds);
         p_sys->p_tls = NULL;
+        p_sys->i_status = CHROMECAST_DISCONNECTED;
     }
 }
 



More information about the vlc-commits mailing list