projects
/
project
/
procd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
utrace: Deliver signals to traced processes
[project/procd.git]
/
trace
/
trace.c
diff --git
a/trace/trace.c
b/trace/trace.c
index
f882c2e
..
cad2d37
100644
(file)
--- a/
trace/trace.c
+++ b/
trace/trace.c
@@
-148,6
+148,7
@@
static void print_syscalls(int policy, const char *json)
static void tracer_cb(struct uloop_process *c, int ret)
{
struct tracee *tracee = container_of(c, struct tracee, proc);
static void tracer_cb(struct uloop_process *c, int ret)
{
struct tracee *tracee = container_of(c, struct tracee, proc);
+ int inject_signal = 0;
if (WIFSTOPPED(ret)) {
if (WSTOPSIG(ret) & 0x80) {
if (WIFSTOPPED(ret)) {
if (WSTOPSIG(ret) & 0x80) {
@@
-163,7
+164,9
@@
static void tracer_cb(struct uloop_process *c, int ret)
}
}
tracee->in_syscall = !tracee->in_syscall;
}
}
tracee->in_syscall = !tracee->in_syscall;
- } else if ((ret >> 8) == (SIGTRAP | (PTRACE_EVENT_FORK << 8))) {
+ } else if ((ret >> 8) == (SIGTRAP | (PTRACE_EVENT_FORK << 8)) ||
+ (ret >> 8) == (SIGTRAP | (PTRACE_EVENT_VFORK << 8)) ||
+ (ret >> 8) == (SIGTRAP | (PTRACE_EVENT_CLONE << 8))) {
struct tracee *child = calloc(1, sizeof(struct tracee));
ptrace(PTRACE_GETEVENTMSG, c->pid, 0, &child->proc.pid);
struct tracee *child = calloc(1, sizeof(struct tracee));
ptrace(PTRACE_GETEVENTMSG, c->pid, 0, &child->proc.pid);
@@
-172,8
+175,13
@@
static void tracer_cb(struct uloop_process *c, int ret)
uloop_process_add(&child->proc);
if (debug)
fprintf(stderr, "Tracing new child %d\n", child->proc.pid);
uloop_process_add(&child->proc);
if (debug)
fprintf(stderr, "Tracing new child %d\n", child->proc.pid);
+ } else {
+ inject_signal = WSTOPSIG(ret);
+ if (debug)
+ fprintf(stderr, "Injecting signal %d into pid %d\n",
+ inject_signal, tracee->proc.pid);
}
}
- } else if (WIFEXITED(ret)) {
+ } else if (WIFEXITED(ret)
|| (WIFSIGNALED(ret) && WTERMSIG(ret))
) {
if (tracee == &tracer) {
uloop_end(); /* Main process exit */
} else {
if (tracee == &tracer) {
uloop_end(); /* Main process exit */
} else {
@@
-184,7
+192,7
@@
static void tracer_cb(struct uloop_process *c, int ret)
return;
}
return;
}
- ptrace(PTRACE_SYSCALL, c->pid, 0,
0
);
+ ptrace(PTRACE_SYSCALL, c->pid, 0,
inject_signal
);
uloop_process_add(c);
}
uloop_process_add(c);
}
@@
-254,7
+262,9
@@
int main(int argc, char **argv, char **envp)
ptrace(PTRACE_SETOPTIONS, child, 0,
PTRACE_O_TRACESYSGOOD |
ptrace(PTRACE_SETOPTIONS, child, 0,
PTRACE_O_TRACESYSGOOD |
- PTRACE_O_TRACEFORK);
+ PTRACE_O_TRACEFORK |
+ PTRACE_O_TRACEVFORK |
+ PTRACE_O_TRACECLONE);
ptrace(PTRACE_SYSCALL, child, 0, 0);
uloop_init();
ptrace(PTRACE_SYSCALL, child, 0, 0);
uloop_init();