Commit a4a661bf authored by topjohnwu's avatar topjohnwu

Small code restructuring

parent 771e5004
...@@ -391,74 +391,73 @@ void proc_monitor() { ...@@ -391,74 +391,73 @@ void proc_monitor() {
ptrace(PTRACE_DETACH, pid, 0, 0); ptrace(PTRACE_DETACH, pid, 0, 0);
} }
}); });
if (WIFSTOPPED(status)) { if (!WIFSTOPPED(status)) {
if (detaches[pid]) { // Nothing to do with us
PTRACE_LOG("detach\n"); PTRACE_LOG("terminate\n");
DETACH_AND_CONT; DETACH_AND_CONT;
} }
if (WSTOPSIG(status) == SIGTRAP && WEVENT(status)) { if (detaches[pid]) {
unsigned long msg; PTRACE_LOG("detach\n");
xptrace(PTRACE_GETEVENTMSG, pid, nullptr, &msg); DETACH_AND_CONT;
if (zygote_map.count(pid)) { }
// Zygote event if (WSTOPSIG(status) == SIGTRAP && WEVENT(status)) {
switch (WEVENT(status)) { unsigned long msg;
case PTRACE_EVENT_FORK: xptrace(PTRACE_GETEVENTMSG, pid, nullptr, &msg);
case PTRACE_EVENT_VFORK: if (zygote_map.count(pid)) {
PTRACE_LOG("zygote forked: [%d]\n", msg); // Zygote event
attaches[msg] = true; switch (WEVENT(status)) {
if (unknowns[msg]) { case PTRACE_EVENT_FORK:
/* Stop the child again to make sure case PTRACE_EVENT_VFORK:
* we are monitoring the proper events */ PTRACE_LOG("zygote forked: [%d]\n", msg);
unknowns[msg] = false; attaches[msg] = true;
tgkill(msg, msg, SIGSTOP); if (unknowns[msg]) {
} /* Stop the child again to make sure
break; * we are monitoring the proper events */
case PTRACE_EVENT_EXIT: unknowns[msg] = false;
PTRACE_LOG("zygote exited with status: [%d]\n", msg); tgkill(msg, msg, SIGSTOP);
zygote_map.erase(pid); }
DETACH_AND_CONT; break;
default: case PTRACE_EVENT_EXIT:
PTRACE_LOG("unknown event: %d\n", WEVENT(status)); PTRACE_LOG("zygote exited with status: [%d]\n", msg);
break; zygote_map.erase(pid);
} DETACH_AND_CONT;
xptrace(PTRACE_CONT, pid); default:
} else { PTRACE_LOG("unknown event: %d\n", WEVENT(status));
switch (WEVENT(status)) { break;
case PTRACE_EVENT_CLONE:
PTRACE_LOG("create new threads: [%d]\n", msg);
detaches[msg] = true;
if (attaches[pid] && check_pid(pid))
continue;
break;
case PTRACE_EVENT_EXEC:
case PTRACE_EVENT_EXIT:
PTRACE_LOG("exited or execve\n");
DETACH_AND_CONT;
default:
PTRACE_LOG("unknown event: %d\n", WEVENT(status));
break;
}
xptrace(PTRACE_CONT, pid);
} }
} else if (WSTOPSIG(status) == SIGSTOP) { xptrace(PTRACE_CONT, pid);
if (attaches[pid]) { } else {
PTRACE_LOG("SIGSTOP from zygote child\n"); switch (WEVENT(status)) {
xptrace(PTRACE_SETOPTIONS, pid, nullptr, case PTRACE_EVENT_CLONE:
PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEEXIT); PTRACE_LOG("create new threads: [%d]\n", msg);
} else { detaches[msg] = true;
PTRACE_LOG("SIGSTOP from unknown\n"); if (attaches[pid] && check_pid(pid))
unknowns[pid] = true; continue;
break;
case PTRACE_EVENT_EXEC:
case PTRACE_EVENT_EXIT:
PTRACE_LOG("exited or execve\n");
DETACH_AND_CONT;
default:
PTRACE_LOG("unknown event: %d\n", WEVENT(status));
break;
} }
xptrace(PTRACE_CONT, pid); xptrace(PTRACE_CONT, pid);
}
} else if (WSTOPSIG(status) == SIGSTOP) {
if (attaches[pid]) {
PTRACE_LOG("SIGSTOP from zygote child\n");
xptrace(PTRACE_SETOPTIONS, pid, nullptr,
PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEEXIT);
} else { } else {
// Not caused by us, resend signal PTRACE_LOG("SIGSTOP from unknown\n");
xptrace(PTRACE_CONT, pid, nullptr, WSTOPSIG(status)); unknowns[pid] = true;
PTRACE_LOG("signal [%d]\n", WSTOPSIG(status));
} }
xptrace(PTRACE_CONT, pid);
} else { } else {
// Nothing to do with us // Not caused by us, resend signal
PTRACE_LOG("terminate\n"); xptrace(PTRACE_CONT, pid, nullptr, WSTOPSIG(status));
DETACH_AND_CONT; PTRACE_LOG("signal [%d]\n", WSTOPSIG(status));
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment