commit 8ca4cd6995735592d472fe1849af41c74e28f641
parent d28733275b23495b0be3192b2c3f3ca9d99c9aa4
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Fri, 31 May 2024 18:34:37 +0200

fix(native): dobby crash

Diffstat:
Anative/jni/src/dobby_helper.h | 17+++++++++++++++++
Mnative/jni/src/hooks/composer_hook.h | 2+-
Mnative/jni/src/hooks/custom_emoji_font.h | 2+-
Mnative/jni/src/hooks/duplex_hook.h | 2+-
Mnative/jni/src/hooks/fstat_hook.h | 2+-
Mnative/jni/src/hooks/sqlite_mutex.h | 2+-
Mnative/jni/src/hooks/unary_call.h | 2+-
Mnative/jni/src/library.cpp | 1+
8 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/native/jni/src/dobby_helper.h b/native/jni/src/dobby_helper.h @@ -0,0 +1,16 @@ +#pragma once + +#include <pthread.h> +#include <sys/mman.h> +#include <string.h> +#include <dobby.h> +#include "logger.h" + + +static pthread_mutex_t hook_mutex = PTHREAD_MUTEX_INITIALIZER; + +static void inline SafeHook(void *addr, void *hook, void **original) { + pthread_mutex_lock(&hook_mutex); + DobbyHook(addr, hook, original); + pthread_mutex_unlock(&hook_mutex); +}+ \ No newline at end of file diff --git a/native/jni/src/hooks/composer_hook.h b/native/jni/src/hooks/composer_hook.h @@ -184,6 +184,6 @@ namespace ComposerHook { LOGE("js_eval_ptr signature not found"); return; } - DobbyHook((void*) js_eval_ptr, (void *) js_eval, (void **) &js_eval_original); + SafeHook((void*) js_eval_ptr, (void *) js_eval, (void **) &js_eval_original); } } \ No newline at end of file diff --git a/native/jni/src/hooks/custom_emoji_font.h b/native/jni/src/hooks/custom_emoji_font.h @@ -15,6 +15,6 @@ namespace CustomEmojiFont { } void init() { - DobbyHook((void *) DobbySymbolResolver("libc.so", "open"), (void *)open_hook, (void **)&open_hook_original); + SafeHook((void *) DobbySymbolResolver("libc.so", "open"), (void *)open_hook, (void **)&open_hook_original); } } \ No newline at end of file diff --git a/native/jni/src/hooks/duplex_hook.h b/native/jni/src/hooks/duplex_hook.h @@ -21,6 +21,6 @@ namespace DuplexHook { } void init(JNIEnv* env) { - DobbyHook((void *)env->functions->IsSameObject, (void *)IsSameObject, (void **)&IsSameObject_original); + SafeHook((void *)env->functions->IsSameObject, (void *)IsSameObject, (void **)&IsSameObject_original); } } \ No newline at end of file diff --git a/native/jni/src/hooks/fstat_hook.h b/native/jni/src/hooks/fstat_hook.h @@ -22,6 +22,6 @@ namespace FstatHook { } void init() { - DobbyHook((void *)DobbySymbolResolver("libc.so", "fstat"), (void *)fstat_hook, (void **)&fstat_hook_original); + SafeHook((void *)DobbySymbolResolver("libc.so", "fstat"), (void *)fstat_hook, (void **)&fstat_hook_original); } } \ No newline at end of file diff --git a/native/jni/src/hooks/sqlite_mutex.h b/native/jni/src/hooks/sqlite_mutex.h @@ -41,6 +41,6 @@ namespace SqliteMutexHook { LOGE("sqlite3 openDatabase sig not found"); return; } - DobbyHook((void *) open_database_sig, (void *) sqlite3_open_hook, (void **) &sqlite3_open_hook_original); + SafeHook((void *) open_database_sig, (void *) sqlite3_open_hook, (void **) &sqlite3_open_hook_original); } } \ No newline at end of file diff --git a/native/jni/src/hooks/unary_call.h b/native/jni/src/hooks/unary_call.h @@ -79,7 +79,7 @@ namespace UnaryCallHook { native_lib_on_unary_call_method = env->GetMethodID(env->GetObjectClass(common::native_lib_object), "onNativeUnaryCall", "(Ljava/lang/String;[B)L" BUILD_NAMESPACE "/NativeRequestData;"); if (unaryCall_func != 0) { - DobbyHook((void *)unaryCall_func, (void *)unaryCall_hook, (void **)&unaryCall_hook_original); + SafeHook((void *)unaryCall_func, (void *)unaryCall_hook, (void **)&unaryCall_hook_original); } else { LOGE("Can't find unaryCall signature"); } diff --git a/native/jni/src/library.cpp b/native/jni/src/library.cpp @@ -4,6 +4,7 @@ #include <vector> #include <thread> +#include "dobby_helper.h" #include "logger.h" #include "common.h" #include "hooks/unary_call.h"