Skip to content

Commit

Permalink
[REFACT] Refactored syscall info storage between before/after watch
Browse files Browse the repository at this point in the history
  • Loading branch information
hasherezade committed Aug 22, 2024
1 parent 5ea3887 commit ef77bb7
Showing 1 changed file with 35 additions and 11 deletions.
46 changes: 35 additions & 11 deletions TinyTracer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -544,12 +544,37 @@ BOOL _fetchSyscallData(CONTEXT* ctxt, SYSCALL_STANDARD &std, ADDRINT &address)
return TRUE;
}

std::map<THREADID, ADDRINT> syscallFromThread;
std::map<THREADID, ADDRINT> syscallAddr;
//---
struct SyscallInfo
{
ADDRINT ssid;
ADDRINT addrFrom;

SyscallInfo(ADDRINT _ssid = UNKNOWN_ADDR, ADDRINT _addrFrom = UNKNOWN_ADDR)
: ssid(_ssid), addrFrom(_addrFrom) {}

SyscallInfo(const SyscallInfo& other)
: ssid(other.ssid), addrFrom(other.addrFrom) { }

void fill(ADDRINT _ssid, ADDRINT _addrFrom )
{
this->ssid = _ssid;
this->addrFrom = _addrFrom;
}

void reset()
{
this->fill(UNKNOWN_ADDR, UNKNOWN_ADDR);
}
};

std::map<THREADID, SyscallInfo> syscallFromThread;

VOID SyscallCalled(THREADID tid, CONTEXT* ctxt, SYSCALL_STANDARD std, VOID* v)
{
PinLocker locker;
syscallFromThread[tid] = UNKNOWN_ADDR; // reset just in case

syscallFromThread[tid] = SyscallInfo(); // reset just in case
ADDRINT address = UNKNOWN_ADDR;
if (!_fetchSyscallData(ctxt, std, address)) {
return;
Expand All @@ -560,8 +585,8 @@ VOID SyscallCalled(THREADID tid, CONTEXT* ctxt, SYSCALL_STANDARD std, VOID* v)
const ADDRINT syscallNum = PIN_GetSyscallNumber(ctxt, std);
if (syscallNum == UNKNOWN_ADDR) return; //invalid

syscallFromThread[tid] = syscallNum;
syscallAddr[tid] = address;
syscallFromThread[tid].fill(syscallNum, address);

std::string funcName = m_Settings.syscallsTable.getName(syscallNum);

if (wType == WatchedType::WATCHED_MY_MODULE) {
Expand Down Expand Up @@ -618,15 +643,14 @@ VOID SyscallCalledAfter(THREADID tid, CONTEXT* ctxt, SYSCALL_STANDARD std, VOID*
PinLocker locker;

auto itr = syscallFromThread.find(tid);
if (itr == syscallFromThread.end() || itr->second == UNKNOWN_ADDR) {
if (itr == syscallFromThread.end() || itr->second.ssid == UNKNOWN_ADDR) {
return;
}
const ADDRINT syscallNum = itr->second;
if (syscallNum == UNKNOWN_ADDR) return; //invalid

ADDRINT address = syscallAddr[tid];

syscallFromThread.erase(itr); // sycall completed, erase the stored info
const ADDRINT syscallNum = itr->second.ssid;
const ADDRINT address = itr->second.addrFrom;

itr->second.reset(); // sycall completed, erase the stored info

if (address == UNKNOWN_ADDR) {
return;
Expand Down

0 comments on commit ef77bb7

Please sign in to comment.