Add self dev check

This commit is contained in:
vvb2060 2023-01-21 05:22:52 +08:00
parent 772a1b168c
commit 640824076c
No known key found for this signature in database
GPG Key ID: 59B2BF15A79E26FA

View File

@ -45,6 +45,7 @@ class HookInfos : public std::map<uintptr_t, HookInfo, std::greater<>> {
public: public:
static auto ScanHookInfo() { static auto ScanHookInfo() {
static ino_t kSelfInode = 0; static ino_t kSelfInode = 0;
static dev_t kSelfDev = 0;
HookInfos info; HookInfos info;
auto maps = lsplt::MapInfo::Scan(); auto maps = lsplt::MapInfo::Scan();
if (kSelfInode == 0) { if (kSelfInode == 0) {
@ -52,6 +53,7 @@ public:
for (auto &map : maps) { for (auto &map : maps) {
if (self >= map.start && self < map.end) { if (self >= map.start && self < map.end) {
kSelfInode = map.inode; kSelfInode = map.inode;
kSelfDev = map.dev;
LOGV("self inode = %lu", kSelfInode); LOGV("self inode = %lu", kSelfInode);
break; break;
} }
@ -67,13 +69,13 @@ public:
continue; continue;
} }
auto start = map.start; auto start = map.start;
auto inode = map.inode; bool self = map.inode == kSelfInode && map.dev == kSelfDev;
info.emplace(start, HookInfo{{std::move(map)}, {}, 0, nullptr, inode == kSelfInode}); info.emplace(start, HookInfo{{std::move(map)}, {}, 0, nullptr, self});
} }
return info; return info;
} }
// fiter out ignored // filter out ignored
void Filter(const std::list<RegisterInfo> &register_info) { void Filter(const std::list<RegisterInfo> &register_info) {
for (auto iter = begin(); iter != end();) { for (auto iter = begin(); iter != end();) {
const auto &info = iter->second; const auto &info = iter->second;
@ -273,7 +275,7 @@ inline namespace v2 {
[[maybe_unused]] bool RegisterHook(dev_t dev, ino_t inode, std::string_view symbol, void *callback, [[maybe_unused]] bool RegisterHook(dev_t dev, ino_t inode, std::string_view symbol, void *callback,
void **backup) { void **backup) {
if (inode == 0 || symbol.empty() || !callback) return false; if (dev == 0 || inode == 0 || symbol.empty() || !callback) return false;
std::unique_lock lock(hook_mutex); std::unique_lock lock(hook_mutex);
static_assert(std::numeric_limits<uintptr_t>::min() == 0); static_assert(std::numeric_limits<uintptr_t>::min() == 0);
@ -291,7 +293,7 @@ inline namespace v2 {
[[maybe_unused]] bool RegisterHook(dev_t dev, ino_t inode, uintptr_t offset, size_t size, [[maybe_unused]] bool RegisterHook(dev_t dev, ino_t inode, uintptr_t offset, size_t size,
std::string_view symbol, void *callback, void **backup) { std::string_view symbol, void *callback, void **backup) {
if (inode == 0 || symbol.empty() || !callback) return false; if (dev == 0 || inode == 0 || symbol.empty() || !callback) return false;
std::unique_lock lock(hook_mutex); std::unique_lock lock(hook_mutex);
static_assert(std::numeric_limits<uintptr_t>::min() == 0); static_assert(std::numeric_limits<uintptr_t>::min() == 0);