ptrace.c 29.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9
/*
 * linux/kernel/ptrace.c
 *
 * (C) Copyright 1999 Linus Torvalds
 *
 * Common interfaces for "ptrace()" which we do not want
 * to continually duplicate across every architecture.
 */

10
#include <linux/capability.h>
11
#include <linux/export.h>
L
Linus Torvalds 已提交
12 13 14 15 16 17 18
#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/highmem.h>
#include <linux/pagemap.h>
#include <linux/ptrace.h>
#include <linux/security.h>
19
#include <linux/signal.h>
A
Al Viro 已提交
20
#include <linux/audit.h>
21
#include <linux/pid_namespace.h>
22
#include <linux/syscalls.h>
R
Roland McGrath 已提交
23
#include <linux/uaccess.h>
24
#include <linux/regset.h>
25
#include <linux/hw_breakpoint.h>
26
#include <linux/cn_proc.h>
27
#include <linux/compat.h>
L
Linus Torvalds 已提交
28

29

30 31 32 33 34 35
static int ptrace_trapping_sleep_fn(void *flags)
{
	schedule();
	return 0;
}

L
Linus Torvalds 已提交
36 37 38 39 40 41
/*
 * ptrace a task: make the debugger its new parent and
 * move it to the ptrace list.
 *
 * Must be called with the tasklist lock write-held.
 */
42
void __ptrace_link(struct task_struct *child, struct task_struct *new_parent)
L
Linus Torvalds 已提交
43
{
R
Roland McGrath 已提交
44 45
	BUG_ON(!list_empty(&child->ptrace_entry));
	list_add(&child->ptrace_entry, &new_parent->ptraced);
L
Linus Torvalds 已提交
46 47
	child->parent = new_parent;
}
R
Roland McGrath 已提交
48

49 50 51
/**
 * __ptrace_unlink - unlink ptracee and restore its execution state
 * @child: ptracee to be unlinked
L
Linus Torvalds 已提交
52
 *
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
 * Remove @child from the ptrace list, move it back to the original parent,
 * and restore the execution state so that it conforms to the group stop
 * state.
 *
 * Unlinking can happen via two paths - explicit PTRACE_DETACH or ptracer
 * exiting.  For PTRACE_DETACH, unless the ptracee has been killed between
 * ptrace_check_attach() and here, it's guaranteed to be in TASK_TRACED.
 * If the ptracer is exiting, the ptracee can be in any state.
 *
 * After detach, the ptracee should be in a state which conforms to the
 * group stop.  If the group is stopped or in the process of stopping, the
 * ptracee should be put into TASK_STOPPED; otherwise, it should be woken
 * up from TASK_TRACED.
 *
 * If the ptracee is in TASK_TRACED and needs to be moved to TASK_STOPPED,
 * it goes through TRACED -> RUNNING -> STOPPED transition which is similar
 * to but in the opposite direction of what happens while attaching to a
 * stopped task.  However, in this direction, the intermediate RUNNING
 * state is not hidden even from the current ptracer and if it immediately
 * re-attaches and performs a WNOHANG wait(2), it may fail.
73 74 75
 *
 * CONTEXT:
 * write_lock_irq(tasklist_lock)
L
Linus Torvalds 已提交
76
 */
77
void __ptrace_unlink(struct task_struct *child)
L
Linus Torvalds 已提交
78
{
79 80
	BUG_ON(!child->ptrace);

L
Linus Torvalds 已提交
81
	child->ptrace = 0;
R
Roland McGrath 已提交
82 83
	child->parent = child->real_parent;
	list_del_init(&child->ptrace_entry);
L
Linus Torvalds 已提交
84 85

	spin_lock(&child->sighand->siglock);
86

87 88 89 90 91 92 93
	/*
	 * Clear all pending traps and TRAPPING.  TRAPPING should be
	 * cleared regardless of JOBCTL_STOP_PENDING.  Do it explicitly.
	 */
	task_clear_jobctl_pending(child, JOBCTL_TRAP_MASK);
	task_clear_jobctl_trapping(child);

94
	/*
95
	 * Reinstate JOBCTL_STOP_PENDING if group stop is in effect and
96 97 98 99
	 * @child isn't dead.
	 */
	if (!(child->flags & PF_EXITING) &&
	    (child->signal->flags & SIGNAL_STOP_STOPPED ||
100
	     child->signal->group_stop_count)) {
101
		child->jobctl |= JOBCTL_STOP_PENDING;
102

103 104 105 106 107 108 109 110 111 112 113
		/*
		 * This is only possible if this thread was cloned by the
		 * traced task running in the stopped group, set the signal
		 * for the future reports.
		 * FIXME: we should change ptrace_init_task() to handle this
		 * case.
		 */
		if (!(child->jobctl & JOBCTL_STOP_SIGMASK))
			child->jobctl |= SIGSTOP;
	}

114 115 116 117 118 119
	/*
	 * If transition to TASK_STOPPED is pending or in TASK_TRACED, kick
	 * @child in the butt.  Note that @resume should be used iff @child
	 * is in TASK_TRACED; otherwise, we might unduly disrupt
	 * TASK_KILLABLE sleeps.
	 */
120
	if (child->jobctl & JOBCTL_STOP_PENDING || task_is_traced(child))
121
		ptrace_signal_wake_up(child, true);
122

L
Linus Torvalds 已提交
123 124 125
	spin_unlock(&child->sighand->siglock);
}

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
/* Ensure that nothing can wake it up, even SIGKILL */
static bool ptrace_freeze_traced(struct task_struct *task)
{
	bool ret = false;

	/* Lockless, nobody but us can set this flag */
	if (task->jobctl & JOBCTL_LISTENING)
		return ret;

	spin_lock_irq(&task->sighand->siglock);
	if (task_is_traced(task) && !__fatal_signal_pending(task)) {
		task->state = __TASK_TRACED;
		ret = true;
	}
	spin_unlock_irq(&task->sighand->siglock);

	return ret;
}

static void ptrace_unfreeze_traced(struct task_struct *task)
{
	if (task->state != __TASK_TRACED)
		return;

	WARN_ON(!task->ptrace || task->parent != current);

	spin_lock_irq(&task->sighand->siglock);
	if (__fatal_signal_pending(task))
		wake_up_state(task, __TASK_TRACED);
	else
		task->state = TASK_TRACED;
	spin_unlock_irq(&task->sighand->siglock);
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
/**
 * ptrace_check_attach - check whether ptracee is ready for ptrace operation
 * @child: ptracee to check for
 * @ignore_state: don't check whether @child is currently %TASK_TRACED
 *
 * Check whether @child is being ptraced by %current and ready for further
 * ptrace operations.  If @ignore_state is %false, @child also should be in
 * %TASK_TRACED state and on return the child is guaranteed to be traced
 * and not executing.  If @ignore_state is %true, @child can be in any
 * state.
 *
 * CONTEXT:
 * Grabs and releases tasklist_lock and @child->sighand->siglock.
 *
 * RETURNS:
 * 0 on success, -ESRCH if %child is not ready.
L
Linus Torvalds 已提交
176
 */
177
static int ptrace_check_attach(struct task_struct *child, bool ignore_state)
L
Linus Torvalds 已提交
178 179 180 181 182 183 184 185 186 187 188
{
	int ret = -ESRCH;

	/*
	 * We take the read lock around doing both checks to close a
	 * possible race where someone else was tracing our child and
	 * detached between these two checks.  After this locked check,
	 * we are sure that this is our traced child and that can only
	 * be changed by us so it's not changing right after this.
	 */
	read_lock(&tasklist_lock);
189 190
	if (child->ptrace && child->parent == current) {
		WARN_ON(child->state == __TASK_TRACED);
191 192 193 194
		/*
		 * child->sighand can't be NULL, release_task()
		 * does ptrace_unlink() before __exit_signal().
		 */
195
		if (ignore_state || ptrace_freeze_traced(child))
196
			ret = 0;
L
Linus Torvalds 已提交
197 198 199
	}
	read_unlock(&tasklist_lock);

200 201 202 203 204 205 206 207 208 209 210
	if (!ret && !ignore_state) {
		if (!wait_task_inactive(child, __TASK_TRACED)) {
			/*
			 * This can only happen if may_ptrace_stop() fails and
			 * ptrace_stop() changes ->state back to TASK_RUNNING,
			 * so we should not worry about leaking __TASK_TRACED.
			 */
			WARN_ON(child->state == __TASK_TRACED);
			ret = -ESRCH;
		}
	}
L
Linus Torvalds 已提交
211 212 213 214

	return ret;
}

215 216 217 218 219 220 221 222
static int ptrace_has_cap(struct user_namespace *ns, unsigned int mode)
{
	if (mode & PTRACE_MODE_NOAUDIT)
		return has_ns_capability_noaudit(current, ns, CAP_SYS_PTRACE);
	else
		return has_ns_capability(current, ns, CAP_SYS_PTRACE);
}

223 224
/* Returns 0 on success, -errno on denial. */
static int __ptrace_may_access(struct task_struct *task, unsigned int mode)
225
{
226
	const struct cred *cred = current_cred(), *tcred;
227

228 229 230 231 232 233 234 235 236 237 238 239
	/* May we inspect the given task?
	 * This check is used both for attaching with ptrace
	 * and for allowing access to sensitive information in /proc.
	 *
	 * ptrace_attach denies several cases that /proc allows
	 * because setting up the necessary parent/child relationship
	 * or halting the specified task is impossible.
	 */
	int dumpable = 0;
	/* Don't let security modules deny introspection */
	if (task == current)
		return 0;
240 241
	rcu_read_lock();
	tcred = __task_cred(task);
242 243 244 245 246 247
	if (uid_eq(cred->uid, tcred->euid) &&
	    uid_eq(cred->uid, tcred->suid) &&
	    uid_eq(cred->uid, tcred->uid)  &&
	    gid_eq(cred->gid, tcred->egid) &&
	    gid_eq(cred->gid, tcred->sgid) &&
	    gid_eq(cred->gid, tcred->gid))
248
		goto ok;
249
	if (ptrace_has_cap(tcred->user_ns, mode))
250 251 252 253
		goto ok;
	rcu_read_unlock();
	return -EPERM;
ok:
254
	rcu_read_unlock();
255
	smp_rmb();
256
	if (task->mm)
257
		dumpable = get_dumpable(task->mm);
E
Eric W. Biederman 已提交
258 259 260
	rcu_read_lock();
	if (!dumpable && !ptrace_has_cap(__task_cred(task)->user_ns, mode)) {
		rcu_read_unlock();
261
		return -EPERM;
E
Eric W. Biederman 已提交
262 263
	}
	rcu_read_unlock();
264

265
	return security_ptrace_access_check(task, mode);
266 267
}

268
bool ptrace_may_access(struct task_struct *task, unsigned int mode)
269 270 271
{
	int err;
	task_lock(task);
272
	err = __ptrace_may_access(task, mode);
273
	task_unlock(task);
R
Roland McGrath 已提交
274
	return !err;
275 276
}

T
Tejun Heo 已提交
277
static int ptrace_attach(struct task_struct *task, long request,
278
			 unsigned long addr,
T
Tejun Heo 已提交
279
			 unsigned long flags)
L
Linus Torvalds 已提交
280
{
T
Tejun Heo 已提交
281
	bool seize = (request == PTRACE_SEIZE);
L
Linus Torvalds 已提交
282
	int retval;
283

T
Tejun Heo 已提交
284
	retval = -EIO;
285 286 287 288 289 290 291 292 293
	if (seize) {
		if (addr != 0)
			goto out;
		if (flags & ~(unsigned long)PTRACE_O_MASK)
			goto out;
		flags = PT_PTRACED | PT_SEIZED | (flags << PT_OPT_FLAG_SHIFT);
	} else {
		flags = PT_PTRACED;
	}
T
Tejun Heo 已提交
294

A
Al Viro 已提交
295 296
	audit_ptrace(task);

L
Linus Torvalds 已提交
297
	retval = -EPERM;
298 299
	if (unlikely(task->flags & PF_KTHREAD))
		goto out;
300
	if (same_thread_group(task, current))
301 302
		goto out;

303 304
	/*
	 * Protect exec's credential calculations against our interference;
305
	 * SUID, SGID and LSM creds get determined differently
306
	 * under ptrace.
D
David Howells 已提交
307
	 */
308
	retval = -ERESTARTNOINTR;
309
	if (mutex_lock_interruptible(&task->signal->cred_guard_mutex))
D
David Howells 已提交
310
		goto out;
311

312
	task_lock(task);
313
	retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH);
314
	task_unlock(task);
L
Linus Torvalds 已提交
315
	if (retval)
316
		goto unlock_creds;
L
Linus Torvalds 已提交
317

318
	write_lock_irq(&tasklist_lock);
319 320
	retval = -EPERM;
	if (unlikely(task->exit_state))
321
		goto unlock_tasklist;
322
	if (task->ptrace)
323
		goto unlock_tasklist;
324

T
Tejun Heo 已提交
325
	if (seize)
326
		flags |= PT_SEIZED;
E
Eric W. Biederman 已提交
327 328
	rcu_read_lock();
	if (ns_capable(__task_cred(task)->user_ns, CAP_SYS_PTRACE))
329
		flags |= PT_PTRACE_CAP;
E
Eric W. Biederman 已提交
330
	rcu_read_unlock();
331
	task->ptrace = flags;
L
Linus Torvalds 已提交
332 333

	__ptrace_link(task, current);
T
Tejun Heo 已提交
334 335 336 337

	/* SEIZE doesn't trap tracee on attach */
	if (!seize)
		send_sig_info(SIGSTOP, SEND_SIG_FORCED, task);
338

339 340 341
	spin_lock(&task->sighand->siglock);

	/*
342
	 * If the task is already STOPPED, set JOBCTL_TRAP_STOP and
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
	 * TRAPPING, and kick it so that it transits to TRACED.  TRAPPING
	 * will be cleared if the child completes the transition or any
	 * event which clears the group stop states happens.  We'll wait
	 * for the transition to complete before returning from this
	 * function.
	 *
	 * This hides STOPPED -> RUNNING -> TRACED transition from the
	 * attaching thread but a different thread in the same group can
	 * still observe the transient RUNNING state.  IOW, if another
	 * thread's WNOHANG wait(2) on the stopped tracee races against
	 * ATTACH, the wait(2) may fail due to the transient RUNNING.
	 *
	 * The following task_is_stopped() test is safe as both transitions
	 * in and out of STOPPED are protected by siglock.
	 */
358
	if (task_is_stopped(task) &&
359
	    task_set_jobctl_pending(task, JOBCTL_TRAP_STOP | JOBCTL_TRAPPING))
360
		signal_wake_up_state(task, __TASK_STOPPED);
361 362 363

	spin_unlock(&task->sighand->siglock);

364
	retval = 0;
365 366 367
unlock_tasklist:
	write_unlock_irq(&tasklist_lock);
unlock_creds:
368
	mutex_unlock(&task->signal->cred_guard_mutex);
369
out:
370
	if (!retval) {
371 372
		wait_on_bit(&task->jobctl, JOBCTL_TRAPPING_BIT,
			    ptrace_trapping_sleep_fn, TASK_UNINTERRUPTIBLE);
373 374 375
		proc_ptrace_connector(task, PTRACE_ATTACH);
	}

L
Linus Torvalds 已提交
376 377 378
	return retval;
}

379 380 381 382 383 384
/**
 * ptrace_traceme  --  helper for PTRACE_TRACEME
 *
 * Performs checks and sets PT_PTRACED.
 * Should be used by all ptrace implementations for PTRACE_TRACEME.
 */
385
static int ptrace_traceme(void)
386 387 388
{
	int ret = -EPERM;

389 390
	write_lock_irq(&tasklist_lock);
	/* Are we already being traced? */
391 392 393 394 395 396 397 398 399 400 401 402
	if (!current->ptrace) {
		ret = security_ptrace_traceme(current->parent);
		/*
		 * Check PF_EXITING to ensure ->real_parent has not passed
		 * exit_ptrace(). Otherwise we don't report the error but
		 * pretend ->real_parent untraces us right after return.
		 */
		if (!ret && !(current->real_parent->flags & PF_EXITING)) {
			current->ptrace = PT_PTRACED;
			__ptrace_link(current, current->real_parent);
		}
	}
403 404
	write_unlock_irq(&tasklist_lock);

405 406 407
	return ret;
}

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
/*
 * Called with irqs disabled, returns true if childs should reap themselves.
 */
static int ignoring_children(struct sighand_struct *sigh)
{
	int ret;
	spin_lock(&sigh->siglock);
	ret = (sigh->action[SIGCHLD-1].sa.sa_handler == SIG_IGN) ||
	      (sigh->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT);
	spin_unlock(&sigh->siglock);
	return ret;
}

/*
 * Called with tasklist_lock held for writing.
 * Unlink a traced task, and clean it up if it was a traced zombie.
 * Return true if it needs to be reaped with release_task().
 * (We can't call release_task() here because we already hold tasklist_lock.)
 *
 * If it's a zombie, our attachedness prevented normal parent notification
 * or self-reaping.  Do notification now if it would have happened earlier.
 * If it should reap itself, return true.
 *
431 432 433 434
 * If it's our own child, there is no notification to do. But if our normal
 * children self-reap, then this child was prevented by ptrace and we must
 * reap it now, in that case we must also wake up sub-threads sleeping in
 * do_wait().
435 436 437
 */
static bool __ptrace_detach(struct task_struct *tracer, struct task_struct *p)
{
438 439
	bool dead;

440 441
	__ptrace_unlink(p);

442 443 444 445 446 447 448 449 450 451 452
	if (p->exit_state != EXIT_ZOMBIE)
		return false;

	dead = !thread_group_leader(p);

	if (!dead && thread_group_empty(p)) {
		if (!same_thread_group(p->real_parent, tracer))
			dead = do_notify_parent(p, p->exit_signal);
		else if (ignoring_children(tracer->sighand)) {
			__wake_up_parent(p, tracer);
			dead = true;
453 454
		}
	}
455 456 457 458
	/* Mark it as in the process of being reaped. */
	if (dead)
		p->exit_state = EXIT_DEAD;
	return dead;
459 460
}

461
static int ptrace_detach(struct task_struct *child, unsigned int data)
L
Linus Torvalds 已提交
462
{
463
	bool dead = false;
464

465
	if (!valid_signal(data))
466
		return -EIO;
L
Linus Torvalds 已提交
467 468 469

	/* Architecture-specific hardware disable .. */
	ptrace_disable(child);
470
	clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
L
Linus Torvalds 已提交
471

472
	write_lock_irq(&tasklist_lock);
473 474 475 476
	/*
	 * This child can be already killed. Make sure de_thread() or
	 * our sub-thread doing do_wait() didn't do release_task() yet.
	 */
477 478
	if (child->ptrace) {
		child->exit_code = data;
479
		dead = __ptrace_detach(current, child);
480
	}
L
Linus Torvalds 已提交
481 482
	write_unlock_irq(&tasklist_lock);

483
	proc_ptrace_connector(child, PTRACE_DETACH);
484 485 486
	if (unlikely(dead))
		release_task(child);

L
Linus Torvalds 已提交
487 488 489
	return 0;
}

490
/*
491 492 493
 * Detach all tasks we were using ptrace on. Called with tasklist held
 * for writing, and returns with it held too. But note it can release
 * and reacquire the lock.
494 495
 */
void exit_ptrace(struct task_struct *tracer)
496 497
	__releases(&tasklist_lock)
	__acquires(&tasklist_lock)
498 499 500 501
{
	struct task_struct *p, *n;
	LIST_HEAD(ptrace_dead);

502 503 504
	if (likely(list_empty(&tracer->ptraced)))
		return;

505
	list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry) {
506 507 508
		if (unlikely(p->ptrace & PT_EXITKILL))
			send_sig_info(SIGKILL, SEND_SIG_FORCED, p);

509 510 511 512
		if (__ptrace_detach(tracer, p))
			list_add(&p->ptrace_entry, &ptrace_dead);
	}

513
	write_unlock_irq(&tasklist_lock);
514 515 516 517 518 519
	BUG_ON(!list_empty(&tracer->ptraced));

	list_for_each_entry_safe(p, n, &ptrace_dead, ptrace_entry) {
		list_del_init(&p->ptrace_entry);
		release_task(p);
	}
520 521

	write_lock_irq(&tasklist_lock);
522 523
}

L
Linus Torvalds 已提交
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len)
{
	int copied = 0;

	while (len > 0) {
		char buf[128];
		int this_len, retval;

		this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
		retval = access_process_vm(tsk, src, buf, this_len, 0);
		if (!retval) {
			if (copied)
				break;
			return -EIO;
		}
		if (copy_to_user(dst, buf, retval))
			return -EFAULT;
		copied += retval;
		src += retval;
		dst += retval;
R
Roland McGrath 已提交
544
		len -= retval;
L
Linus Torvalds 已提交
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
	}
	return copied;
}

int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len)
{
	int copied = 0;

	while (len > 0) {
		char buf[128];
		int this_len, retval;

		this_len = (len > sizeof(buf)) ? sizeof(buf) : len;
		if (copy_from_user(buf, src, this_len))
			return -EFAULT;
		retval = access_process_vm(tsk, dst, buf, this_len, 1);
		if (!retval) {
			if (copied)
				break;
			return -EIO;
		}
		copied += retval;
		src += retval;
		dst += retval;
R
Roland McGrath 已提交
569
		len -= retval;
L
Linus Torvalds 已提交
570 571 572 573
	}
	return copied;
}

574
static int ptrace_setoptions(struct task_struct *child, unsigned long data)
L
Linus Torvalds 已提交
575
{
576 577
	unsigned flags;

578 579 580
	if (data & ~(unsigned long)PTRACE_O_MASK)
		return -EINVAL;

581 582 583 584 585
	/* Avoid intermediate state when all opts are cleared */
	flags = child->ptrace;
	flags &= ~(PTRACE_O_MASK << PT_OPT_FLAG_SHIFT);
	flags |= (data << PT_OPT_FLAG_SHIFT);
	child->ptrace = flags;
L
Linus Torvalds 已提交
586

587
	return 0;
L
Linus Torvalds 已提交
588 589
}

590
static int ptrace_getsiginfo(struct task_struct *child, siginfo_t *info)
L
Linus Torvalds 已提交
591
{
592
	unsigned long flags;
L
Linus Torvalds 已提交
593 594
	int error = -ESRCH;

595
	if (lock_task_sighand(child, &flags)) {
L
Linus Torvalds 已提交
596 597
		error = -EINVAL;
		if (likely(child->last_siginfo != NULL)) {
598
			*info = *child->last_siginfo;
L
Linus Torvalds 已提交
599 600
			error = 0;
		}
601
		unlock_task_sighand(child, &flags);
L
Linus Torvalds 已提交
602 603 604 605
	}
	return error;
}

606
static int ptrace_setsiginfo(struct task_struct *child, const siginfo_t *info)
L
Linus Torvalds 已提交
607
{
608
	unsigned long flags;
L
Linus Torvalds 已提交
609 610
	int error = -ESRCH;

611
	if (lock_task_sighand(child, &flags)) {
L
Linus Torvalds 已提交
612 613
		error = -EINVAL;
		if (likely(child->last_siginfo != NULL)) {
614
			*child->last_siginfo = *info;
L
Linus Torvalds 已提交
615 616
			error = 0;
		}
617
		unlock_task_sighand(child, &flags);
L
Linus Torvalds 已提交
618 619 620 621
	}
	return error;
}

622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
static int ptrace_peek_siginfo(struct task_struct *child,
				unsigned long addr,
				unsigned long data)
{
	struct ptrace_peeksiginfo_args arg;
	struct sigpending *pending;
	struct sigqueue *q;
	int ret, i;

	ret = copy_from_user(&arg, (void __user *) addr,
				sizeof(struct ptrace_peeksiginfo_args));
	if (ret)
		return -EFAULT;

	if (arg.flags & ~PTRACE_PEEKSIGINFO_SHARED)
		return -EINVAL; /* unknown flags */

	if (arg.nr < 0)
		return -EINVAL;

	if (arg.flags & PTRACE_PEEKSIGINFO_SHARED)
		pending = &child->signal->shared_pending;
	else
		pending = &child->pending;

	for (i = 0; i < arg.nr; ) {
		siginfo_t info;
		s32 off = arg.off + i;

		spin_lock_irq(&child->sighand->siglock);
		list_for_each_entry(q, &pending->list, list) {
			if (!off--) {
				copy_siginfo(&info, &q->info);
				break;
			}
		}
		spin_unlock_irq(&child->sighand->siglock);

		if (off >= 0) /* beyond the end of the list */
			break;

#ifdef CONFIG_COMPAT
		if (unlikely(is_compat_task())) {
			compat_siginfo_t __user *uinfo = compat_ptr(data);

			ret = copy_siginfo_to_user32(uinfo, &info);
			ret |= __put_user(info.si_code, &uinfo->si_code);
		} else
#endif
		{
			siginfo_t __user *uinfo = (siginfo_t __user *) data;

			ret = copy_siginfo_to_user(uinfo, &info);
			ret |= __put_user(info.si_code, &uinfo->si_code);
		}

		if (ret) {
			ret = -EFAULT;
			break;
		}

		data += sizeof(siginfo_t);
		i++;

		if (signal_pending(current))
			break;

		cond_resched();
	}

	if (i > 0)
		return i;

	return ret;
}
R
Roland McGrath 已提交
697 698 699 700 701 702 703

#ifdef PTRACE_SINGLESTEP
#define is_singlestep(request)		((request) == PTRACE_SINGLESTEP)
#else
#define is_singlestep(request)		0
#endif

704 705 706 707 708 709
#ifdef PTRACE_SINGLEBLOCK
#define is_singleblock(request)		((request) == PTRACE_SINGLEBLOCK)
#else
#define is_singleblock(request)		0
#endif

R
Roland McGrath 已提交
710 711 712 713 714 715
#ifdef PTRACE_SYSEMU
#define is_sysemu_singlestep(request)	((request) == PTRACE_SYSEMU_SINGLESTEP)
#else
#define is_sysemu_singlestep(request)	0
#endif

716 717
static int ptrace_resume(struct task_struct *child, long request,
			 unsigned long data)
R
Roland McGrath 已提交
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
{
	if (!valid_signal(data))
		return -EIO;

	if (request == PTRACE_SYSCALL)
		set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
	else
		clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);

#ifdef TIF_SYSCALL_EMU
	if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP)
		set_tsk_thread_flag(child, TIF_SYSCALL_EMU);
	else
		clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
#endif

734 735 736 737 738
	if (is_singleblock(request)) {
		if (unlikely(!arch_has_block_step()))
			return -EIO;
		user_enable_block_step(child);
	} else if (is_singlestep(request) || is_sysemu_singlestep(request)) {
R
Roland McGrath 已提交
739 740 741
		if (unlikely(!arch_has_single_step()))
			return -EIO;
		user_enable_single_step(child);
R
Roland McGrath 已提交
742
	} else {
R
Roland McGrath 已提交
743
		user_disable_single_step(child);
R
Roland McGrath 已提交
744
	}
R
Roland McGrath 已提交
745 746

	child->exit_code = data;
747
	wake_up_state(child, __TASK_TRACED);
R
Roland McGrath 已提交
748 749 750 751

	return 0;
}

752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776
#ifdef CONFIG_HAVE_ARCH_TRACEHOOK

static const struct user_regset *
find_regset(const struct user_regset_view *view, unsigned int type)
{
	const struct user_regset *regset;
	int n;

	for (n = 0; n < view->n; ++n) {
		regset = view->regsets + n;
		if (regset->core_note_type == type)
			return regset;
	}

	return NULL;
}

static int ptrace_regset(struct task_struct *task, int req, unsigned int type,
			 struct iovec *kiov)
{
	const struct user_regset_view *view = task_user_regset_view(task);
	const struct user_regset *regset = find_regset(view, type);
	int regset_no;

	if (!regset || (kiov->iov_len % regset->size) != 0)
777
		return -EINVAL;
778 779 780 781 782 783 784 785 786 787 788 789 790

	regset_no = regset - view->regsets;
	kiov->iov_len = min(kiov->iov_len,
			    (__kernel_size_t) (regset->n * regset->size));

	if (req == PTRACE_GETREGSET)
		return copy_regset_to_user(task, view, regset_no, 0,
					   kiov->iov_len, kiov->iov_base);
	else
		return copy_regset_from_user(task, view, regset_no, 0,
					     kiov->iov_len, kiov->iov_base);
}

J
Josh Stone 已提交
791 792 793 794 795 796
/*
 * This is declared in linux/regset.h and defined in machine-dependent
 * code.  We put the export here, near the primary machine-neutral use,
 * to ensure no machine forgets it.
 */
EXPORT_SYMBOL_GPL(task_user_regset_view);
797 798
#endif

L
Linus Torvalds 已提交
799
int ptrace_request(struct task_struct *child, long request,
800
		   unsigned long addr, unsigned long data)
L
Linus Torvalds 已提交
801
{
T
Tejun Heo 已提交
802
	bool seized = child->ptrace & PT_SEIZED;
L
Linus Torvalds 已提交
803
	int ret = -EIO;
T
Tejun Heo 已提交
804
	siginfo_t siginfo, *si;
N
Namhyung Kim 已提交
805 806
	void __user *datavp = (void __user *) data;
	unsigned long __user *datalp = datavp;
T
Tejun Heo 已提交
807
	unsigned long flags;
L
Linus Torvalds 已提交
808 809

	switch (request) {
810 811 812 813 814 815 816
	case PTRACE_PEEKTEXT:
	case PTRACE_PEEKDATA:
		return generic_ptrace_peekdata(child, addr, data);
	case PTRACE_POKETEXT:
	case PTRACE_POKEDATA:
		return generic_ptrace_pokedata(child, addr, data);

L
Linus Torvalds 已提交
817 818 819 820 821 822 823
#ifdef PTRACE_OLDSETOPTIONS
	case PTRACE_OLDSETOPTIONS:
#endif
	case PTRACE_SETOPTIONS:
		ret = ptrace_setoptions(child, data);
		break;
	case PTRACE_GETEVENTMSG:
N
Namhyung Kim 已提交
824
		ret = put_user(child->ptrace_message, datalp);
L
Linus Torvalds 已提交
825
		break;
826

827 828 829 830
	case PTRACE_PEEKSIGINFO:
		ret = ptrace_peek_siginfo(child, addr, data);
		break;

L
Linus Torvalds 已提交
831
	case PTRACE_GETSIGINFO:
832 833
		ret = ptrace_getsiginfo(child, &siginfo);
		if (!ret)
N
Namhyung Kim 已提交
834
			ret = copy_siginfo_to_user(datavp, &siginfo);
L
Linus Torvalds 已提交
835
		break;
836

L
Linus Torvalds 已提交
837
	case PTRACE_SETSIGINFO:
N
Namhyung Kim 已提交
838
		if (copy_from_user(&siginfo, datavp, sizeof siginfo))
839 840 841
			ret = -EFAULT;
		else
			ret = ptrace_setsiginfo(child, &siginfo);
L
Linus Torvalds 已提交
842
		break;
843

T
Tejun Heo 已提交
844 845 846 847 848 849 850 851 852 853 854 855 856 857
	case PTRACE_INTERRUPT:
		/*
		 * Stop tracee without any side-effect on signal or job
		 * control.  At least one trap is guaranteed to happen
		 * after this request.  If @child is already trapped, the
		 * current trap is not disturbed and another trap will
		 * happen after the current trap is ended with PTRACE_CONT.
		 *
		 * The actual trap might not be PTRACE_EVENT_STOP trap but
		 * the pending condition is cleared regardless.
		 */
		if (unlikely(!seized || !lock_task_sighand(child, &flags)))
			break;

T
Tejun Heo 已提交
858 859 860 861 862 863
		/*
		 * INTERRUPT doesn't disturb existing trap sans one
		 * exception.  If ptracer issued LISTEN for the current
		 * STOP, this INTERRUPT should clear LISTEN and re-trap
		 * tracee into STOP.
		 */
T
Tejun Heo 已提交
864
		if (likely(task_set_jobctl_pending(child, JOBCTL_TRAP_STOP)))
865
			ptrace_signal_wake_up(child, child->jobctl & JOBCTL_LISTENING);
T
Tejun Heo 已提交
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883

		unlock_task_sighand(child, &flags);
		ret = 0;
		break;

	case PTRACE_LISTEN:
		/*
		 * Listen for events.  Tracee must be in STOP.  It's not
		 * resumed per-se but is not considered to be in TRACED by
		 * wait(2) or ptrace(2).  If an async event (e.g. group
		 * stop state change) happens, tracee will enter STOP trap
		 * again.  Alternatively, ptracer can issue INTERRUPT to
		 * finish listening and re-trap tracee into STOP.
		 */
		if (unlikely(!seized || !lock_task_sighand(child, &flags)))
			break;

		si = child->last_siginfo;
884 885 886 887 888 889 890
		if (likely(si && (si->si_code >> 8) == PTRACE_EVENT_STOP)) {
			child->jobctl |= JOBCTL_LISTENING;
			/*
			 * If NOTIFY is set, it means event happened between
			 * start of this trap and now.  Trigger re-trap.
			 */
			if (child->jobctl & JOBCTL_TRAP_NOTIFY)
891
				ptrace_signal_wake_up(child, true);
892 893
			ret = 0;
		}
T
Tejun Heo 已提交
894 895 896
		unlock_task_sighand(child, &flags);
		break;

A
Alexey Dobriyan 已提交
897 898 899
	case PTRACE_DETACH:	 /* detach a process that was attached. */
		ret = ptrace_detach(child, data);
		break;
R
Roland McGrath 已提交
900

901 902
#ifdef CONFIG_BINFMT_ELF_FDPIC
	case PTRACE_GETFDPIC: {
903
		struct mm_struct *mm = get_task_mm(child);
904 905
		unsigned long tmp = 0;

906 907 908 909
		ret = -ESRCH;
		if (!mm)
			break;

910 911
		switch (addr) {
		case PTRACE_GETFDPIC_EXEC:
912
			tmp = mm->context.exec_fdpic_loadmap;
913 914
			break;
		case PTRACE_GETFDPIC_INTERP:
915
			tmp = mm->context.interp_fdpic_loadmap;
916 917 918 919
			break;
		default:
			break;
		}
920
		mmput(mm);
921

N
Namhyung Kim 已提交
922
		ret = put_user(tmp, datalp);
923 924 925 926
		break;
	}
#endif

R
Roland McGrath 已提交
927 928 929
#ifdef PTRACE_SINGLESTEP
	case PTRACE_SINGLESTEP:
#endif
930 931 932
#ifdef PTRACE_SINGLEBLOCK
	case PTRACE_SINGLEBLOCK:
#endif
R
Roland McGrath 已提交
933 934 935 936 937 938 939 940 941 942 943 944 945
#ifdef PTRACE_SYSEMU
	case PTRACE_SYSEMU:
	case PTRACE_SYSEMU_SINGLESTEP:
#endif
	case PTRACE_SYSCALL:
	case PTRACE_CONT:
		return ptrace_resume(child, request, data);

	case PTRACE_KILL:
		if (child->exit_state)	/* already dead */
			return 0;
		return ptrace_resume(child, request, SIGKILL);

946 947 948 949 950
#ifdef CONFIG_HAVE_ARCH_TRACEHOOK
	case PTRACE_GETREGSET:
	case PTRACE_SETREGSET:
	{
		struct iovec kiov;
N
Namhyung Kim 已提交
951
		struct iovec __user *uiov = datavp;
952 953 954 955 956 957 958 959 960 961 962 963 964 965

		if (!access_ok(VERIFY_WRITE, uiov, sizeof(*uiov)))
			return -EFAULT;

		if (__get_user(kiov.iov_base, &uiov->iov_base) ||
		    __get_user(kiov.iov_len, &uiov->iov_len))
			return -EFAULT;

		ret = ptrace_regset(child, request, addr, &kiov);
		if (!ret)
			ret = __put_user(kiov.iov_len, &uiov->iov_len);
		break;
	}
#endif
L
Linus Torvalds 已提交
966 967 968 969 970 971
	default:
		break;
	}

	return ret;
}
972

973
static struct task_struct *ptrace_get_task_struct(pid_t pid)
974 975
{
	struct task_struct *child;
976

977
	rcu_read_lock();
978
	child = find_task_by_vpid(pid);
979 980
	if (child)
		get_task_struct(child);
981
	rcu_read_unlock();
982

983
	if (!child)
984 985
		return ERR_PTR(-ESRCH);
	return child;
986 987
}

988 989 990 991
#ifndef arch_ptrace_attach
#define arch_ptrace_attach(child)	do { } while (0)
#endif

992 993
SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr,
		unsigned long, data)
994 995 996 997
{
	struct task_struct *child;
	long ret;

998 999
	if (request == PTRACE_TRACEME) {
		ret = ptrace_traceme();
1000 1001
		if (!ret)
			arch_ptrace_attach(current);
1002
		goto out;
1003 1004 1005 1006 1007 1008 1009
	}

	child = ptrace_get_task_struct(pid);
	if (IS_ERR(child)) {
		ret = PTR_ERR(child);
		goto out;
	}
1010

T
Tejun Heo 已提交
1011
	if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) {
1012
		ret = ptrace_attach(child, request, addr, data);
1013 1014 1015 1016 1017 1018
		/*
		 * Some architectures need to do book-keeping after
		 * a ptrace attach.
		 */
		if (!ret)
			arch_ptrace_attach(child);
1019
		goto out_put_task_struct;
1020 1021
	}

T
Tejun Heo 已提交
1022 1023
	ret = ptrace_check_attach(child, request == PTRACE_KILL ||
				  request == PTRACE_INTERRUPT);
1024 1025 1026 1027
	if (ret < 0)
		goto out_put_task_struct;

	ret = arch_ptrace(child, request, addr, data);
1028 1029
	if (ret || request != PTRACE_DETACH)
		ptrace_unfreeze_traced(child);
1030 1031 1032 1033 1034 1035

 out_put_task_struct:
	put_task_struct(child);
 out:
	return ret;
}
A
Alexey Dobriyan 已提交
1036

1037 1038
int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr,
			    unsigned long data)
A
Alexey Dobriyan 已提交
1039 1040 1041 1042 1043 1044 1045 1046 1047
{
	unsigned long tmp;
	int copied;

	copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), 0);
	if (copied != sizeof(tmp))
		return -EIO;
	return put_user(tmp, (unsigned long __user *)data);
}
A
Alexey Dobriyan 已提交
1048

1049 1050
int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr,
			    unsigned long data)
A
Alexey Dobriyan 已提交
1051 1052 1053 1054 1055 1056
{
	int copied;

	copied = access_process_vm(tsk, addr, &data, sizeof(data), 1);
	return (copied == sizeof(data)) ? 0 : -EIO;
}
R
Roland McGrath 已提交
1057

1058
#if defined CONFIG_COMPAT
R
Roland McGrath 已提交
1059 1060 1061 1062 1063 1064 1065
#include <linux/compat.h>

int compat_ptrace_request(struct task_struct *child, compat_long_t request,
			  compat_ulong_t addr, compat_ulong_t data)
{
	compat_ulong_t __user *datap = compat_ptr(data);
	compat_ulong_t word;
1066
	siginfo_t siginfo;
R
Roland McGrath 已提交
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
	int ret;

	switch (request) {
	case PTRACE_PEEKTEXT:
	case PTRACE_PEEKDATA:
		ret = access_process_vm(child, addr, &word, sizeof(word), 0);
		if (ret != sizeof(word))
			ret = -EIO;
		else
			ret = put_user(word, datap);
		break;

	case PTRACE_POKETEXT:
	case PTRACE_POKEDATA:
		ret = access_process_vm(child, addr, &data, sizeof(data), 1);
		ret = (ret != sizeof(data) ? -EIO : 0);
		break;

	case PTRACE_GETEVENTMSG:
		ret = put_user((compat_ulong_t) child->ptrace_message, datap);
		break;

1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
	case PTRACE_GETSIGINFO:
		ret = ptrace_getsiginfo(child, &siginfo);
		if (!ret)
			ret = copy_siginfo_to_user32(
				(struct compat_siginfo __user *) datap,
				&siginfo);
		break;

	case PTRACE_SETSIGINFO:
		memset(&siginfo, 0, sizeof siginfo);
		if (copy_siginfo_from_user32(
			    &siginfo, (struct compat_siginfo __user *) datap))
			ret = -EFAULT;
		else
			ret = ptrace_setsiginfo(child, &siginfo);
		break;
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
#ifdef CONFIG_HAVE_ARCH_TRACEHOOK
	case PTRACE_GETREGSET:
	case PTRACE_SETREGSET:
	{
		struct iovec kiov;
		struct compat_iovec __user *uiov =
			(struct compat_iovec __user *) datap;
		compat_uptr_t ptr;
		compat_size_t len;

		if (!access_ok(VERIFY_WRITE, uiov, sizeof(*uiov)))
			return -EFAULT;

		if (__get_user(ptr, &uiov->iov_base) ||
		    __get_user(len, &uiov->iov_len))
			return -EFAULT;

		kiov.iov_base = compat_ptr(ptr);
		kiov.iov_len = len;

		ret = ptrace_regset(child, request, addr, &kiov);
		if (!ret)
			ret = __put_user(kiov.iov_len, &uiov->iov_len);
		break;
	}
#endif
1131

R
Roland McGrath 已提交
1132 1133 1134 1135 1136 1137
	default:
		ret = ptrace_request(child, request, addr, data);
	}

	return ret;
}
R
Roland McGrath 已提交
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155

asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
				  compat_long_t addr, compat_long_t data)
{
	struct task_struct *child;
	long ret;

	if (request == PTRACE_TRACEME) {
		ret = ptrace_traceme();
		goto out;
	}

	child = ptrace_get_task_struct(pid);
	if (IS_ERR(child)) {
		ret = PTR_ERR(child);
		goto out;
	}

T
Tejun Heo 已提交
1156
	if (request == PTRACE_ATTACH || request == PTRACE_SEIZE) {
1157
		ret = ptrace_attach(child, request, addr, data);
R
Roland McGrath 已提交
1158 1159 1160 1161 1162 1163 1164 1165 1166
		/*
		 * Some architectures need to do book-keeping after
		 * a ptrace attach.
		 */
		if (!ret)
			arch_ptrace_attach(child);
		goto out_put_task_struct;
	}

T
Tejun Heo 已提交
1167 1168
	ret = ptrace_check_attach(child, request == PTRACE_KILL ||
				  request == PTRACE_INTERRUPT);
1169
	if (!ret) {
R
Roland McGrath 已提交
1170
		ret = compat_arch_ptrace(child, request, addr, data);
1171 1172 1173
		if (ret || request != PTRACE_DETACH)
			ptrace_unfreeze_traced(child);
	}
R
Roland McGrath 已提交
1174 1175 1176 1177 1178 1179

 out_put_task_struct:
	put_task_struct(child);
 out:
	return ret;
}
1180
#endif	/* CONFIG_COMPAT */
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196

#ifdef CONFIG_HAVE_HW_BREAKPOINT
int ptrace_get_breakpoints(struct task_struct *tsk)
{
	if (atomic_inc_not_zero(&tsk->ptrace_bp_refcnt))
		return 0;

	return -1;
}

void ptrace_put_breakpoints(struct task_struct *tsk)
{
	if (atomic_dec_and_test(&tsk->ptrace_bp_refcnt))
		flush_ptrace_hw_breakpoint(tsk);
}
#endif /* CONFIG_HAVE_HW_BREAKPOINT */