diff options
author | Göran Jönsson <goranjn@axis.com> | 2014-08-27 13:45:57 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-09-04 12:56:47 +0300 |
commit | 102d428ca8529fe595b0a0acc8c70f2911dd44d2 (patch) | |
tree | 45a499327526ebcdc3ccbffdb5e5d2040601ec08 | |
parent | 2755e05d78d68e28ca2a49d196e8466bc88f9d6e (diff) | |
download | gstreamer-plugins-base-102d428ca8529fe595b0a0acc8c70f2911dd44d2.tar.gz |
rtspconnection: Protect readsrc, writesrc and controllsrc with a mutex
Fixes a crash when controlsrc, readsrc or writesrc are modified from
gst_rtsp_source_dispatch_read/write and gst_rtsp_watch_reset at the
same time.
https://bugzilla.gnome.org/show_bug.cgi?id=735569
-rw-r--r-- | gst-libs/gst/rtsp/gstrtspconnection.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c index 2218921ee..da969f029 100644 --- a/gst-libs/gst/rtsp/gstrtspconnection.c +++ b/gst-libs/gst/rtsp/gstrtspconnection.c @@ -3127,6 +3127,7 @@ gst_rtsp_source_dispatch_read (GPollableInputStream * stream, if (res == GST_RTSP_EINTR) goto done; else if (G_UNLIKELY (res == GST_RTSP_EEOF)) { + g_mutex_lock (&watch->mutex); if (watch->readsrc) { g_source_remove_child_source ((GSource *) watch, watch->readsrc); g_source_unref (watch->readsrc); @@ -3139,6 +3140,7 @@ gst_rtsp_source_dispatch_read (GPollableInputStream * stream, conn->socket1 = NULL; conn->input_stream = NULL; } + g_mutex_unlock (&watch->mutex); /* When we are in tunnelled mode, the read socket can be closed and we * should be prepared for a new POST method to reopen it */ @@ -3150,6 +3152,7 @@ gst_rtsp_source_dispatch_read (GPollableInputStream * stream, if (watch->funcs.tunnel_lost) res = watch->funcs.tunnel_lost (watch, watch->user_data); /* we add read source on the write socket able to detect when client closes get channel in tunneled mode */ + g_mutex_lock (&watch->mutex); if (watch->conn->control_stream && !watch->controlsrc) { watch->controlsrc = g_pollable_input_stream_create_source (G_POLLABLE_INPUT_STREAM @@ -3159,6 +3162,7 @@ gst_rtsp_source_dispatch_read (GPollableInputStream * stream, NULL); g_source_add_child_source ((GSource *) watch, watch->controlsrc); } + g_mutex_unlock (&watch->mutex); goto read_done; } else goto eof; @@ -3471,6 +3475,7 @@ gst_rtsp_watch_new (GstRTSPConnection * conn, void gst_rtsp_watch_reset (GstRTSPWatch * watch) { + g_mutex_lock (&watch->mutex); if (watch->readsrc) { g_source_remove_child_source ((GSource *) watch, watch->readsrc); g_source_unref (watch->readsrc); @@ -3513,6 +3518,7 @@ gst_rtsp_watch_reset (GstRTSPWatch * watch) } else { watch->controlsrc = NULL; } + g_mutex_unlock (&watch->mutex); } /** |