From 052d342bafd8460c327378ae82b97e3ca07f09bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tadas=20Barzd=C5=BEius?= Date: Mon, 21 Aug 2017 20:38:36 +0300 Subject: [PATCH] format: fix segmentation fault Double free error. On failure avformat_open_input frees AVFormatContext. I had it wrapped with context::Input::wrap. On avformat_open_input failure it would free AVFormatContext and Drop implementation for context::Input would try to call avformat_close_input on same AVFormatContext resulting in segmentation fault. --- src/format/mod.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/format/mod.rs b/src/format/mod.rs index 72ca2a6..b300c0d 100644 --- a/src/format/mod.rs +++ b/src/format/mod.rs @@ -181,14 +181,14 @@ pub fn input_with_dictionary>(path: &P, options: Dictionary) -> R pub fn input_with_interrupt, F>(path: &P, closure: F) -> Result where F: FnMut() -> bool { unsafe { - let mut ps = context::Input::wrap(avformat_alloc_context()); + let mut ps = avformat_alloc_context(); let path = from_path(path); - (*ps.as_mut_ptr()).interrupt_callback = interrupt::new(Box::new(closure)).interrupt; + (*ps).interrupt_callback = interrupt::new(Box::new(closure)).interrupt; - match avformat_open_input(&mut ps.as_mut_ptr(), path.as_ptr(), ptr::null_mut(), ptr::null_mut()) { + match avformat_open_input(&mut ps, path.as_ptr(), ptr::null_mut(), ptr::null_mut()) { 0 => { - match avformat_find_stream_info(ps.as_mut_ptr(), ptr::null_mut()) { - r if r >= 0 => Ok(ps), + match avformat_find_stream_info(ps, ptr::null_mut()) { + r if r >= 0 => Ok(context::Input::wrap(ps)), e => Err(Error::from(e)), } }