rtsp: don't leak address and socket
[platform/upstream/gstreamer.git] / gst-libs / gst / rtsp / gstrtspconnection.c
index 9855228..fa7ec81 100644 (file)
@@ -322,10 +322,12 @@ gst_rtsp_connection_accept (GSocket * socket, GstRTSPConnection ** conn,
   ip = g_inet_address_to_string (g_inet_socket_address_get_address
       (G_INET_SOCKET_ADDRESS (addr)));
   port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (addr));
+  g_object_unref (addr);
 
   ret =
       gst_rtsp_connection_create_from_socket (client_sock, ip, port, NULL,
       conn);
+  g_object_unref (client_sock);
   g_free (ip);
 
   return ret;
@@ -426,6 +428,7 @@ do_connect (const gchar * ip, guint16 port, GSocket ** socket_out,
   if (!g_socket_connect (socket, saddr, cancellable, &err)) {
     if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_PENDING))
       goto sys_error;
+    g_clear_error (&err);
   } else {
     goto done;
   }
@@ -444,12 +447,14 @@ do_connect (const gchar * ip, guint16 port, GSocket ** socket_out,
   }
   g_socket_set_timeout (socket, 0);
 
-  if (g_socket_check_connect_result (socket, &err))
+  if (!g_socket_check_connect_result (socket, &err))
     goto sys_error;
 
 done:
   g_object_unref (saddr);
 
+  *socket_out = socket;
+
   return GST_RTSP_OK;
 
   /* ERRORS */
@@ -2153,6 +2158,17 @@ gst_rtsp_connection_close (GstRTSPConnection * conn)
 {
   g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
 
+  /* last unref closes the connection we don't want to explicitly close here
+   * because these sockets might have been provided at construction */
+  if (conn->socket0) {
+    g_object_unref (conn->socket0);
+    conn->socket0 = NULL;
+  }
+  if (conn->socket1) {
+    g_object_unref (conn->socket1);
+    conn->socket1 = NULL;
+  }
+
   g_free (conn->ip);
   conn->ip = NULL;
 
@@ -2195,10 +2211,6 @@ gst_rtsp_connection_free (GstRTSPConnection * conn)
   g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
 
   res = gst_rtsp_connection_close (conn);
-  if (conn->socket0)
-    g_object_unref (conn->socket0);
-  if (conn->socket1)
-    g_object_unref (conn->socket1);
 
   if (conn->cancellable)
     g_object_unref (conn->cancellable);
@@ -3320,7 +3332,7 @@ gst_rtsp_watch_write_data (GstRTSPWatch * watch, const guint8 * data,
   g_mutex_lock (watch->mutex);
 
   /* try to send the message synchronously first */
-  if (watch->messages->length == 0) {
+  if (watch->messages->length == 0 && watch->write_data == NULL) {
     res =
         write_bytes (watch->conn->write_socket, data, &off, size,
         watch->conn->cancellable);