aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ptrace.h35
-rw-r--r--kernel/signal.c33
2 files changed, 67 insertions, 1 deletions
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 515bff053de8..6ab80714a916 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -204,6 +204,41 @@ static inline void user_enable_block_step(struct task_struct *task)
204} 204}
205#endif /* arch_has_block_step */ 205#endif /* arch_has_block_step */
206 206
207#ifndef arch_ptrace_stop_needed
208/**
209 * arch_ptrace_stop_needed - Decide whether arch_ptrace_stop() should be called
210 * @code: current->exit_code value ptrace will stop with
211 * @info: siginfo_t pointer (or %NULL) for signal ptrace will stop with
212 *
213 * This is called with the siglock held, to decide whether or not it's
214 * necessary to release the siglock and call arch_ptrace_stop() with the
215 * same @code and @info arguments. It can be defined to a constant if
216 * arch_ptrace_stop() is never required, or always is. On machines where
217 * this makes sense, it should be defined to a quick test to optimize out
218 * calling arch_ptrace_stop() when it would be superfluous. For example,
219 * if the thread has not been back to user mode since the last stop, the
220 * thread state might indicate that nothing needs to be done.
221 */
222#define arch_ptrace_stop_needed(code, info) (0)
223#endif
224
225#ifndef arch_ptrace_stop
226/**
227 * arch_ptrace_stop - Do machine-specific work before stopping for ptrace
228 * @code: current->exit_code value ptrace will stop with
229 * @info: siginfo_t pointer (or %NULL) for signal ptrace will stop with
230 *
231 * This is called with no locks held when arch_ptrace_stop_needed() has
232 * just returned nonzero. It is allowed to block, e.g. for user memory
233 * access. The arch can have machine-specific work to be done before
234 * ptrace stops. On ia64, register backing store gets written back to user
235 * memory here. Since this can be costly (requires dropping the siglock),
236 * we only do it when the arch requires it for this particular stop, as
237 * indicated by arch_ptrace_stop_needed().
238 */
239#define arch_ptrace_stop(code, info) do { } while (0)
240#endif
241
207#endif 242#endif
208 243
209#endif 244#endif
diff --git a/kernel/signal.c b/kernel/signal.c
index e46971560fcb..5d30ff561847 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1578,6 +1578,17 @@ static inline int may_ptrace_stop(void)
1578} 1578}
1579 1579
1580/* 1580/*
1581 * Return nonzero if there is a SIGKILL that should be waking us up.
1582 * Called with the siglock held.
1583 */
1584static int sigkill_pending(struct task_struct *tsk)
1585{
1586 return ((sigismember(&tsk->pending.signal, SIGKILL) ||
1587 sigismember(&tsk->signal->shared_pending.signal, SIGKILL)) &&
1588 !unlikely(sigismember(&tsk->blocked, SIGKILL)));
1589}
1590
1591/*
1581 * This must be called with current->sighand->siglock held. 1592 * This must be called with current->sighand->siglock held.
1582 * 1593 *
1583 * This should be the path for all ptrace stops. 1594 * This should be the path for all ptrace stops.
@@ -1590,6 +1601,26 @@ static inline int may_ptrace_stop(void)
1590 */ 1601 */
1591static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info) 1602static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info)
1592{ 1603{
1604 int killed = 0;
1605
1606 if (arch_ptrace_stop_needed(exit_code, info)) {
1607 /*
1608 * The arch code has something special to do before a
1609 * ptrace stop. This is allowed to block, e.g. for faults
1610 * on user stack pages. We can't keep the siglock while
1611 * calling arch_ptrace_stop, so we must release it now.
1612 * To preserve proper semantics, we must do this before
1613 * any signal bookkeeping like checking group_stop_count.
1614 * Meanwhile, a SIGKILL could come in before we retake the
1615 * siglock. That must prevent us from sleeping in TASK_TRACED.
1616 * So after regaining the lock, we must check for SIGKILL.
1617 */
1618 spin_unlock_irq(&current->sighand->siglock);
1619 arch_ptrace_stop(exit_code, info);
1620 spin_lock_irq(&current->sighand->siglock);
1621 killed = sigkill_pending(current);
1622 }
1623
1593 /* 1624 /*
1594 * If there is a group stop in progress, 1625 * If there is a group stop in progress,
1595 * we must participate in the bookkeeping. 1626 * we must participate in the bookkeeping.
@@ -1605,7 +1636,7 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info)
1605 spin_unlock_irq(&current->sighand->siglock); 1636 spin_unlock_irq(&current->sighand->siglock);
1606 try_to_freeze(); 1637 try_to_freeze();
1607 read_lock(&tasklist_lock); 1638 read_lock(&tasklist_lock);
1608 if (may_ptrace_stop()) { 1639 if (!unlikely(killed) && may_ptrace_stop()) {
1609 do_notify_parent_cldstop(current, CLD_TRAPPED); 1640 do_notify_parent_cldstop(current, CLD_TRAPPED);
1610 read_unlock(&tasklist_lock); 1641 read_unlock(&tasklist_lock);
1611 schedule(); 1642 schedule();