iOS: open file on aarch64 breaks permissions
According to Apple arm64 calling convention varargs always are passed through stack. Since `open` is actually a vararg function on Darwin's, it means that older declaration caused permissions to be taken from stack, while passed through register => it set file permissions to garbage and it was simply impossible to read/delete files after they were created. They way this commit handles it is to preserve compatibility with existing code - it simply creates a shim unsafe function so all existing callers continue work as nothing happened.
This commit is contained in:
parent
dd077d5dec
commit
3f4181a6e5
1 changed files with 29 additions and 2 deletions
|
|
@ -5003,9 +5003,36 @@ pub mod funcs {
|
|||
use types::os::arch::c95::{c_char, c_int};
|
||||
use types::os::arch::posix88::mode_t;
|
||||
|
||||
mod open_shim {
|
||||
extern {
|
||||
#[cfg(any(target_os = "macos",
|
||||
target_os = "ios"))]
|
||||
pub fn open(path: *const ::c_char, oflag: ::c_int, ...)
|
||||
-> ::c_int;
|
||||
|
||||
#[cfg(not(any(target_os = "macos",
|
||||
target_os = "ios")))]
|
||||
pub fn open(path: *const ::c_char, oflag: ::c_int, mode: ::mode_t)
|
||||
-> ::c_int;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(target_os = "macos",
|
||||
target_os = "ios"))]
|
||||
#[inline]
|
||||
pub unsafe extern fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
|
||||
use types::os::arch::c95::c_uint;
|
||||
open_shim::open(path, oflag, mode as c_uint)
|
||||
}
|
||||
|
||||
#[cfg(not(any(target_os = "macos",
|
||||
target_os = "ios")))]
|
||||
#[inline]
|
||||
pub unsafe extern fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
|
||||
open_shim::open(path, oflag, mode)
|
||||
}
|
||||
|
||||
extern {
|
||||
pub fn open(path: *const c_char, oflag: c_int, mode: mode_t)
|
||||
-> c_int;
|
||||
pub fn creat(path: *const c_char, mode: mode_t) -> c_int;
|
||||
pub fn fcntl(fd: c_int, cmd: c_int, ...) -> c_int;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue