Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 88395
b: refs/heads/master
c: 18c98b6
h: refs/heads/master
i:
  88393: f8fca13
  88391: e91fc5e
v: v3
  • Loading branch information
Roland McGrath authored and Linus Torvalds committed Apr 18, 2008
1 parent 9fd4c31 commit 72618fd
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 30 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0e04388f0189fa1f6812a8e1cb6172136eada87e
refs/heads/master: 18c98b65279c00c3c983a4525161207f1aa6a04b
71 changes: 42 additions & 29 deletions trunk/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -1757,6 +1757,45 @@ static int do_signal_stop(int signr)
return 1;
}

static int ptrace_signal(int signr, siginfo_t *info,
struct pt_regs *regs, void *cookie)
{
if (!(current->ptrace & PT_PTRACED))
return signr;

ptrace_signal_deliver(regs, cookie);

/* Let the debugger run. */
ptrace_stop(signr, 0, info);

/* We're back. Did the debugger cancel the sig? */
signr = current->exit_code;
if (signr == 0)
return signr;

current->exit_code = 0;

/* Update the siginfo structure if the signal has
changed. If the debugger wanted something
specific in the siginfo structure then it should
have updated *info via PTRACE_SETSIGINFO. */
if (signr != info->si_signo) {
info->si_signo = signr;
info->si_errno = 0;
info->si_code = SI_USER;
info->si_pid = task_pid_vnr(current->parent);
info->si_uid = current->parent->uid;
}

/* If the (new) signal is now blocked, requeue it. */
if (sigismember(&current->blocked, signr)) {
specific_send_sig_info(signr, info, current);
signr = 0;
}

return signr;
}

int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
struct pt_regs *regs, void *cookie)
{
Expand Down Expand Up @@ -1785,36 +1824,10 @@ int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka,
if (!signr)
break; /* will return 0 */

if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
ptrace_signal_deliver(regs, cookie);

/* Let the debugger run. */
ptrace_stop(signr, 0, info);

/* We're back. Did the debugger cancel the sig? */
signr = current->exit_code;
if (signr == 0)
continue;

current->exit_code = 0;

/* Update the siginfo structure if the signal has
changed. If the debugger wanted something
specific in the siginfo structure then it should
have updated *info via PTRACE_SETSIGINFO. */
if (signr != info->si_signo) {
info->si_signo = signr;
info->si_errno = 0;
info->si_code = SI_USER;
info->si_pid = task_pid_vnr(current->parent);
info->si_uid = current->parent->uid;
}

/* If the (new) signal is now blocked, requeue it. */
if (sigismember(&current->blocked, signr)) {
specific_send_sig_info(signr, info, current);
if (signr != SIGKILL) {
signr = ptrace_signal(signr, info, regs, cookie);
if (!signr)
continue;
}
}

ka = &current->sighand->action[signr-1];
Expand Down

0 comments on commit 72618fd

Please sign in to comment.