From 7a014e4024410b62358ebc7303e0cd33f473e12f Mon Sep 17 00:00:00 2001 From: Zeeshan Ali Date: Thu, 4 Feb 2021 20:53:13 +0100 Subject: [PATCH] rtsp_server: RTSPServer::attach() is fallible If we don't handle the case of RTSPServer::attach() failing, we end up with a panic. Unfortunately, we don't get any details from the underlying call so we've to live with a generic error. :( --- examples/src/bin/rtsp-server-record.rs | 2 +- examples/src/bin/rtsp-server-subclass.rs | 2 +- examples/src/bin/rtsp-server.rs | 2 +- gstreamer-rtsp-server/src/rtsp_server.rs | 19 +++++++++++++++---- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/examples/src/bin/rtsp-server-record.rs b/examples/src/bin/rtsp-server-record.rs index d56f9ea14..e5c201801 100644 --- a/examples/src/bin/rtsp-server-record.rs +++ b/examples/src/bin/rtsp-server-record.rs @@ -130,7 +130,7 @@ fn main_loop() -> Result<(), Error> { // interested in them. In this example, we only do have one, so we can // leave the context parameter empty, it will automatically select // the default one. - let id = server.attach(None); + let id = server.attach(None)?; println!( "Stream ready at rtsps://127.0.0.1:{}/test", diff --git a/examples/src/bin/rtsp-server-subclass.rs b/examples/src/bin/rtsp-server-subclass.rs index 2de3c3e0c..499e12fa6 100644 --- a/examples/src/bin/rtsp-server-subclass.rs +++ b/examples/src/bin/rtsp-server-subclass.rs @@ -58,7 +58,7 @@ fn main_loop() -> Result<(), Error> { // interested in them. In this example, we only do have one, so we can // leave the context parameter empty, it will automatically select // the default one. - let id = server.attach(None); + let id = server.attach(None)?; println!( "Stream ready at rtsp://127.0.0.1:{}/test", diff --git a/examples/src/bin/rtsp-server.rs b/examples/src/bin/rtsp-server.rs index 317ff9388..0de8aaf70 100644 --- a/examples/src/bin/rtsp-server.rs +++ b/examples/src/bin/rtsp-server.rs @@ -66,7 +66,7 @@ fn main_loop() -> Result<(), Error> { // interested in them. In this example, we only do have one, so we can // leave the context parameter empty, it will automatically select // the default one. - let id = server.attach(None); + let id = server.attach(None)?; println!( "Stream ready at rtsp://127.0.0.1:{}/test", diff --git a/gstreamer-rtsp-server/src/rtsp_server.rs b/gstreamer-rtsp-server/src/rtsp_server.rs index 572381a07..153539457 100644 --- a/gstreamer-rtsp-server/src/rtsp_server.rs +++ b/gstreamer-rtsp-server/src/rtsp_server.rs @@ -6,16 +6,27 @@ use glib::source::SourceId; use glib::translate::*; pub trait RTSPServerExtManual: 'static { - fn attach(&self, context: Option<&glib::MainContext>) -> SourceId; + fn attach( + &self, + context: Option<&glib::MainContext>, + ) -> Result; } impl> RTSPServerExtManual for O { - fn attach(&self, context: Option<&glib::MainContext>) -> SourceId { + fn attach( + &self, + context: Option<&glib::MainContext>, + ) -> Result { unsafe { - from_glib(ffi::gst_rtsp_server_attach( + match ffi::gst_rtsp_server_attach( self.as_ref().to_glib_none().0, context.to_glib_none().0, - )) + ) { + 0 => Err(glib::bool_error!( + "Failed to attach main context to RTSP server" + )), + id => Ok(from_glib(id)), + } } } }