From c5e5f97fe5ff0ed422d9d55fe4633bca4be6be78 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 2 Jul 2023 19:11:24 +0200 Subject: [PATCH] Handle a failed `backtrace` call (fix #79) --- cmake/cmake-d | 2 +- lib/provision/androidlibrary.d | 1 + lib/provision/symbols.d | 14 +++++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/cmake/cmake-d b/cmake/cmake-d index cb455cf..d786867 160000 --- a/cmake/cmake-d +++ b/cmake/cmake-d @@ -1 +1 @@ -Subproject commit cb455cf3d818d6e6c41c3614d29cdd9a0793c711 +Subproject commit d786867f671057d2185a9a6b139018a7db8aa1e3 diff --git a/lib/provision/androidlibrary.d b/lib/provision/androidlibrary.d index 3262ff1..05b0f79 100644 --- a/lib/provision/androidlibrary.d +++ b/lib/provision/androidlibrary.d @@ -252,6 +252,7 @@ AndroidLibrary memoryOwner(size_t address) { } } + getLogger().error("Cannot find the parent library! Expect bugs!"); return null; } diff --git a/lib/provision/symbols.d b/lib/provision/symbols.d index 766457e..f94f129 100644 --- a/lib/provision/symbols.d +++ b/lib/provision/symbols.d @@ -47,8 +47,13 @@ private extern (C) AndroidLibrary dlopenWrapper(const char* name) { } try { auto caller = rootLibrary(); - auto lib = new AndroidLibrary(cast(string) name.fromStringz(), caller.hooks); - caller.loadedLibraries ~= lib; + AndroidLibrary lib; + if (caller) { + lib = new AndroidLibrary(cast(string) name.fromStringz(), caller.hooks); + caller.loadedLibraries ~= lib; + } else { + lib = new AndroidLibrary(cast(string) name.fromStringz()); + } return lib; } catch (Throwable) { return null; @@ -64,7 +69,10 @@ private extern (C) void* dlsymWrapper(AndroidLibrary library, const char* symbol private extern (C) void dlcloseWrapper(AndroidLibrary library) { if (library) { - rootLibrary().loadedLibraries.remove!((lib) => lib == library); + auto caller = rootLibrary(); + if (caller) { + rootLibrary().loadedLibraries.remove!((lib) => lib == library); + } destroy(library); } }