diff --git a/mirrord/layer/src/file/hooks.rs b/mirrord/layer/src/file/hooks.rs index 5bb920dde8a..b426ee5b9d1 100644 --- a/mirrord/layer/src/file/hooks.rs +++ b/mirrord/layer/src/file/hooks.rs @@ -948,8 +948,11 @@ unsafe extern "C" fn realpath_detour( source_path: *const c_char, output_path: *mut c_char, ) -> *mut c_char { - realpath_logic(source_path, output_path) - .unwrap_or_bypass_with(|_| FN_REALPATH(source_path, output_path)) + realpath_logic(source_path, output_path).unwrap_or_bypass_with(|_bypass| { + #[cfg(target_os = "macos")] + let source_path = update_ptr_from_bypass(source_path, _bypass); + FN_REALPATH(source_path, output_path) + }) } #[hook_guard_fn] @@ -957,8 +960,43 @@ unsafe extern "C" fn realpath_darwin_extsn_detour( source_path: *const c_char, output_path: *mut c_char, ) -> *mut c_char { - realpath_logic(source_path, output_path) - .unwrap_or_bypass_with(|_| FN_REALPATH_DARWIN_EXTSN(source_path, output_path)) + realpath_logic(source_path, output_path).unwrap_or_bypass_with(|_bypass| { + #[cfg(target_os = "macos")] + let source_path = update_ptr_from_bypass(source_path, _bypass); + FN_REALPATH_DARWIN_EXTSN(source_path, output_path) + }) +} + +unsafe fn readlink_logic( + source_path: *const c_char, + output_path: *mut c_char, + buf_size: size_t, +) -> Detour { + let path = source_path.checked_into(); + + realpath(path).map(|res| { + let written_bytes = usize::min(buf_size, res.as_os_str().len()); + output_path.copy_from_nonoverlapping( + res.as_os_str().as_encoded_bytes().as_ptr() as _, + written_bytes, + ); + written_bytes as isize + }) +} + +/// When path is handled by us, just make it absolute and return, since resolving it remotely +/// doesn't really matter for our case atm (might be in the future) +#[hook_guard_fn] +unsafe extern "C" fn readlink_detour( + source_path: *const c_char, + output_path: *mut c_char, + buf_size: size_t, +) -> ssize_t { + readlink_logic(source_path, output_path, buf_size).unwrap_or_bypass_with(|_bypass| { + #[cfg(target_os = "macos")] + let source_path = update_ptr_from_bypass(source_path, _bypass); + FN_READLINK(source_path, output_path, buf_size) + }) } fn vec_to_iovec(bytes: &[u8], iovecs: &[iovec]) { @@ -1143,6 +1181,14 @@ pub(crate) unsafe fn enable_file_hooks(hook_manager: &mut HookManager) { FN_REALPATH ); + replace!( + hook_manager, + "readlink", + readlink_detour, + FnReadlink, + FN_READLINK + ); + replace!( hook_manager, "realpath$DARWIN_EXTSN",