From 642030f959efe7bd2692bf6a4236d4c1b39ee51a Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Tue, 16 May 2023 13:39:14 -0700 Subject: Fix not finding function symbols for hooking (#2292) Fixes no useful feedback about failing subcommand. Fixes function hooks breaking when running under a path containing spaces. Replaced old usages with this function where possible. Complex shell usages now use `execAndGetShell` which is equal to the old function. --- src/plugins/PluginAPI.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/plugins/PluginAPI.cpp') diff --git a/src/plugins/PluginAPI.cpp b/src/plugins/PluginAPI.cpp index d8b3c82d..48500ee4 100644 --- a/src/plugins/PluginAPI.cpp +++ b/src/plugins/PluginAPI.cpp @@ -280,11 +280,11 @@ APICALL std::vector HyprlandAPI::findFunctionsByName(HANDLE hand #endif #ifdef __clang__ - static const auto SYMBOLS = execAndGet(("llvm-nm -D -j " + FPATH.string()).c_str()); - static const auto SYMBOLSDEMANGLED = execAndGet(("llvm-nm -D -j --demangle " + FPATH.string()).c_str()); + static const auto SYMBOLS = execAndGet(("llvm-nm -D -j \"" + FPATH.string() + "\"").c_str()); + static const auto SYMBOLSDEMANGLED = execAndGet(("llvm-nm -D -j --demangle \"" + FPATH.string() + "\"").c_str()); #else - static const auto SYMBOLS = execAndGet(("nm -D -j " + FPATH.string()).c_str()); - static const auto SYMBOLSDEMANGLED = execAndGet(("nm -D -j --demangle=auto " + FPATH.string()).c_str()); + static const auto SYMBOLS = execAndGet(("nm -D -j \"" + FPATH.string() + "\"").c_str()); + static const auto SYMBOLSDEMANGLED = execAndGet(("nm -D -j --demangle=auto \"" + FPATH.string() + "\"").c_str()); #endif auto demangledFromID = [&](size_t id) -> std::string { @@ -301,6 +301,17 @@ APICALL std::vector HyprlandAPI::findFunctionsByName(HANDLE hand return SYMBOLSDEMANGLED.substr(pos, SYMBOLSDEMANGLED.find('\n', pos + 1) - pos); }; + if (SYMBOLS.empty()) { + Debug::log(ERR, "Unable to search for function \"%s\": no symbols found in binary (is \"%s\" in path?)", name.c_str(), +#ifdef __clang__ + "llvm-nm" +#else + "nm" +#endif + ); + return {}; + } + std::vector matches; std::istringstream inStream(SYMBOLS); @@ -319,4 +330,4 @@ APICALL std::vector HyprlandAPI::findFunctionsByName(HANDLE hand } return matches; -} \ No newline at end of file +} -- cgit v1.2.3