*: fix UB with CString usage

This commit is contained in:
meh 2015-09-22 02:44:13 +02:00
parent 9ab5841b55
commit 2ca44d08d4
6 changed files with 53 additions and 20 deletions

View File

@ -164,7 +164,8 @@ pub fn find(id: Id) -> Option<Codec> {
pub fn find_by_name(name: &str) -> Option<Codec> {
unsafe {
let ptr = avcodec_find_decoder_by_name(CString::new(name).unwrap().as_ptr());
let name = CString::new(name).unwrap();
let ptr = avcodec_find_decoder_by_name(name.as_ptr());
if ptr.is_null() {
None

View File

@ -141,7 +141,8 @@ pub fn find(id: Id) -> Option<Codec> {
pub fn find_by_name(name: &str) -> Option<Codec> {
unsafe {
let ptr = avcodec_find_encoder_by_name(CString::new(name).unwrap().as_ptr());
let name = CString::new(name).unwrap();
let ptr = avcodec_find_encoder_by_name(name.as_ptr());
if ptr.is_null() {
None

View File

@ -49,12 +49,14 @@ impl Graph {
pub fn add<'a, 'b>(&'a mut self, filter: &Filter, name: &str, args: &str) -> Result<Context<'b>, Error> where 'a: 'b {
unsafe {
let name = CString::new(name).unwrap();
let args = CString::new(args).unwrap();
let mut context = ptr::null_mut();
match avfilter_graph_create_filter(&mut context as *mut *mut AVFilterContext,
filter.as_ptr(),
CString::new(name).unwrap().as_ptr(),
CString::new(args).unwrap().as_ptr(),
name.as_ptr(),
args.as_ptr(),
ptr::null_mut(),
self.as_mut_ptr())
{
@ -66,7 +68,8 @@ impl Graph {
pub fn get<'a, 'b>(&'b mut self, name: &str) -> Option<Context<'b>> where 'a: 'b {
unsafe {
let ptr = avfilter_graph_get_filter(self.as_mut_ptr(), CString::new(name).unwrap().as_ptr());
let name = CString::new(name).unwrap();
let ptr = avfilter_graph_get_filter(self.as_mut_ptr(), name.as_ptr());
if ptr.is_null() {
None
@ -134,7 +137,9 @@ impl<'a> Parser<'a> {
panic!("out of memory");
}
(*input).name = av_strdup(CString::new(name).unwrap().as_ptr());
let name = CString::new(name).unwrap();
(*input).name = av_strdup(name.as_ptr());
(*input).filter_ctx = context.as_mut_ptr();
(*input).pad_idx = pad as c_int;
(*input).next = ptr::null_mut();
@ -159,7 +164,9 @@ impl<'a> Parser<'a> {
panic!("out of memory");
}
(*output).name = av_strdup(CString::new(name).unwrap().as_ptr());
let name = CString::new(name).unwrap();
(*output).name = av_strdup(name.as_ptr());
(*output).filter_ctx = context.as_mut_ptr();
(*output).pad_idx = pad as c_int;
(*output).next = ptr::null_mut();
@ -177,8 +184,10 @@ impl<'a> Parser<'a> {
pub fn parse(mut self, spec: &str) -> Result<(), Error> {
unsafe {
let spec = CString::new(spec).unwrap();
let result = avfilter_graph_parse_ptr(self.graph.as_mut_ptr(),
CString::new(spec).unwrap().as_ptr(), &mut self.inputs, &mut self.outputs,
spec.as_ptr(), &mut self.inputs, &mut self.outputs,
ptr::null_mut());
avfilter_inout_free(&mut self.inputs);

View File

@ -54,7 +54,8 @@ pub fn license() -> &'static str {
pub fn find(name: &str) -> Option<Filter> {
unsafe {
let ptr = avfilter_get_by_name(CString::new(name).unwrap().as_ptr());
let name = CString::new(name).unwrap();
let ptr = avfilter_get_by_name(name.as_ptr());
if ptr.is_null() {
None

View File

@ -90,7 +90,9 @@ impl From<AVSampleFormat> for Sample {
impl From<&'static str> for Sample {
fn from(value: &'static str) -> Self {
unsafe {
Sample::from(av_get_sample_fmt(CString::new(value).unwrap().as_ptr()))
let value = CString::new(value).unwrap();
Sample::from(av_get_sample_fmt(value.as_ptr()))
}
}
}

View File

@ -25,8 +25,10 @@ pub unsafe trait Target {
pub trait Settable: Target {
fn set<T: 'static>(&mut self, name: &str, value: &T) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_bin(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
value as *const _ as *const _, mem::size_of::<T>() as c_int,
AV_OPT_SEARCH_CHILDREN))
}
@ -34,17 +36,22 @@ pub trait Settable: Target {
fn set_str(&mut self, name: &str, value: &str) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
let value = CString::new(value).unwrap();
check!(av_opt_set(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
CString::new(value).unwrap().as_ptr(),
name.as_ptr(),
value.as_ptr(),
AV_OPT_SEARCH_CHILDREN))
}
}
fn set_int(&mut self, name: &str, value: i64) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_int(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
value as int64_t,
AV_OPT_SEARCH_CHILDREN))
}
@ -52,8 +59,10 @@ pub trait Settable: Target {
fn set_double(&mut self, name: &str, value: f64) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_double(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
value,
AV_OPT_SEARCH_CHILDREN))
}
@ -61,8 +70,10 @@ pub trait Settable: Target {
fn set_rational<T: Into<Rational>>(&mut self, name: &str, value: T) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_q(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
value.into().into(),
AV_OPT_SEARCH_CHILDREN))
}
@ -70,8 +81,10 @@ pub trait Settable: Target {
fn set_image_size(&mut self, name: &str, w: u32, h: u32) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_image_size(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
w as c_int, h as c_int,
AV_OPT_SEARCH_CHILDREN))
}
@ -79,8 +92,10 @@ pub trait Settable: Target {
fn set_pixel_format(&mut self, name: &str, format: format::Pixel) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_pixel_fmt(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
format.into(),
AV_OPT_SEARCH_CHILDREN))
}
@ -88,8 +103,10 @@ pub trait Settable: Target {
fn set_sample_format(&mut self, name: &str, format: format::Sample) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_sample_fmt(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
format.into(),
AV_OPT_SEARCH_CHILDREN))
}
@ -97,8 +114,10 @@ pub trait Settable: Target {
fn set_channel_layout(&mut self, name: &str, layout: ChannelLayout) -> Result<(), Error> {
unsafe {
let name = CString::new(name).unwrap();
check!(av_opt_set_channel_layout(self.as_mut_ptr(),
CString::new(name).unwrap().as_ptr(),
name.as_ptr(),
layout.bits() as int64_t,
AV_OPT_SEARCH_CHILDREN))
}