*: 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

@ -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))
}