From 29cea574f419842b20b1ad4b59629e53cec5442e Mon Sep 17 00:00:00 2001 From: LoveSy Date: Fri, 16 Jun 2023 01:40:50 +0800 Subject: [PATCH] Wrap rename and renameat --- native/src/base/Android.mk | 2 +- native/src/base/compat/compat.cpp | 35 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/native/src/base/Android.mk b/native/src/base/Android.mk index 40cb6a7c4f5b8..638c86120c842 100644 --- a/native/src/base/Android.mk +++ b/native/src/base/Android.mk @@ -32,5 +32,5 @@ LOCAL_MODULE := libcompat LOCAL_SRC_FILES := compat/compat.cpp # Fix static variables' ctor/dtor when using LTO # See: https://github.com/android/ndk/issues/1461 -LOCAL_EXPORT_LDFLAGS := -static -T src/lto_fix.lds +LOCAL_EXPORT_LDFLAGS := -static -T src/lto_fix.lds -Wl,--wrap=rename -Wl,--wrap=renameat include $(BUILD_STATIC_LIBRARY) diff --git a/native/src/base/compat/compat.cpp b/native/src/base/compat/compat.cpp index 9efc586283948..f087e4c2507c2 100644 --- a/native/src/base/compat/compat.cpp +++ b/native/src/base/compat/compat.cpp @@ -102,6 +102,18 @@ int ftruncate64(int fd, off64_t length) { } #endif +int __real_rename(const char *old_path, const char *new_path); + +int __wrap_rename(const char *old_path, const char *new_path) { + return __real_rename(old_path, new_path); +} + +int __real_renameat(int old_dir_fd, const char *old_path, int new_dir_fd, const char *new_path); + +int __wrap_renameat(int old_dir_fd, const char *old_path, int new_dir_fd, const char *new_path) { + return __real_renameat(old_dir_fd, old_path, new_dir_fd, new_path); +} + [[gnu::weak]] void android_set_abort_message(const char *) {} @@ -112,4 +124,27 @@ extern FILE __sF[]; [[gnu::weak]] FILE* stderr = &__sF[2]; } // extern "C" +#else + +#include +#include +#include + +extern "C" { + +[[maybe_unused]] +int __wrap_renameat(int old_dir_fd, const char *old_path, int new_dir_fd, const char *new_path) { + long out = syscall(__NR_renameat, old_dir_fd, old_path, new_dir_fd, new_path); + if (out == -1) { + out = syscall(__NR_renameat2, old_dir_fd, old_path, new_dir_fd, new_path, 0); + } + return static_cast(out); +} + +[[maybe_unused]] +int __wrap_rename(const char *old_path, const char *new_path) { + return __wrap_renameat(AT_FDCWD, old_path, AT_FDCWD, new_path); +} +} + #endif