fix: make sure io::Error is always converted to an errno

This commit is contained in:
meh
2021-03-11 11:27:15 +01:00
parent 46c1026dc2
commit df8f7e729d
+21 -12
View File
@@ -1,5 +1,5 @@
use std::{slice, convert::TryInto, io::{Read, Write, Seek, SeekFrom}, ptr};
use libc::{c_void, c_int, SEEK_CUR, SEEK_END, SEEK_SET};
use std::{slice, convert::TryInto, io::{self, Read, Write, Seek, SeekFrom}, ptr};
use libc::{c_void, c_int, SEEK_CUR, SEEK_END, SEEK_SET, EINVAL};
use crate::{ffi::*, format::context, Error};
pub enum Proxy {
@@ -57,6 +57,15 @@ impl Io {
}
}
fn as_error(err: io::Error) -> c_int {
if let Some(value) = err.raw_os_error() {
value.try_into().unwrap()
}
else {
EINVAL
}
}
unsafe extern "C" fn read_packet(opaque: *mut c_void, buf: *mut u8, size: c_int) -> c_int {
let mut proxy = Box::<Proxy>::from_raw(opaque.cast());
let buffer = slice::from_raw_parts_mut(buf, size.try_into().unwrap());
@@ -64,7 +73,7 @@ unsafe extern "C" fn read_packet(opaque: *mut c_void, buf: *mut u8, size: c_int)
let result = match proxy.as_read().read(buffer) {
Ok(0) => AVERROR_EOF,
Ok(size) => size.try_into().unwrap(),
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
Err(err) => as_error(err),
};
Box::into_raw(proxy);
@@ -74,11 +83,11 @@ unsafe extern "C" fn read_packet(opaque: *mut c_void, buf: *mut u8, size: c_int)
unsafe extern "C" fn seek(opaque: *mut c_void, offset: i64, whence: c_int) -> i64 {
let mut proxy = Box::<Proxy>::from_raw(opaque.cast());
let result = if whence == AVSEEK_SIZE {
let result: i64 = if whence == AVSEEK_SIZE {
#[cfg(feature = "unstable")]
match proxy.as_seek().stream_len() {
Ok(size) => size,
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
Err(err) => as_error(err),
}
#[cfg(not(feature = "unstable"))]
@@ -93,26 +102,26 @@ unsafe extern "C" fn seek(opaque: *mut c_void, offset: i64, whence: c_int) -> i6
};
match proxy.as_seek().seek(whence) {
Ok(size) => size,
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
Ok(size) => size.try_into().unwrap(),
Err(err) => as_error(err).into(),
}
};
Box::into_raw(proxy);
result.try_into().unwrap()
result
}
unsafe extern "C" fn write_packet(opaque: *mut c_void, buf: *mut u8, size: c_int) -> c_int {
let mut proxy = Box::<Proxy>::from_raw(opaque.cast());
let buffer = slice::from_raw_parts(buf, size.try_into().unwrap());
let result = match proxy.as_write().write(buffer) {
Ok(size) => size,
Err(err) => err.raw_os_error().unwrap().try_into().unwrap(),
let result: c_int = match proxy.as_write().write(buffer) {
Ok(size) => size.try_into().unwrap(),
Err(err) => as_error(err),
};
Box::into_raw(proxy);
result.try_into().unwrap()
result
}
impl Io {