From df8f7e729d654dd2f835bf3d524162d1610e740b Mon Sep 17 00:00:00 2001 From: meh Date: Thu, 11 Mar 2021 11:27:15 +0100 Subject: [PATCH] fix: make sure io::Error is always converted to an errno --- src/format/io.rs | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/format/io.rs b/src/format/io.rs index 66b67b2..d458883 100644 --- a/src/format/io.rs +++ b/src/format/io.rs @@ -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::::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::::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::::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 {