Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0f2d653 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds
Browse files

[PATCH] x86_64: Implement compat functions for PTRACE_SETSIGINFO/GETSIGINFO



Previously we would just silently provide 64 bit services
for this to 32bit processes.

I also added all the other cases explicitely to the ptrace
compat wrapper to make sure this doesn't happen again.

And removed one bogus check in the wrapper.

Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f5adc9c7
Loading
Loading
Loading
Loading
+35 −6
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <asm/debugreg.h>
#include <asm/i387.h>
#include <asm/fpu32.h>
#include <asm/ia32.h>

/*
 * Determines which flags the user has access to [1 = access, 0 = no access].
@@ -199,6 +200,24 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)

#undef R32

static long ptrace32_siginfo(unsigned request, u32 pid, u32 addr, u32 data)
{
	int ret;
	compat_siginfo_t *si32 = (compat_siginfo_t *)compat_ptr(data);
	siginfo_t *si = compat_alloc_user_space(sizeof(siginfo_t));
	if (request == PTRACE_SETSIGINFO) {
		ret = copy_siginfo_from_user32(si, si32);
		if (ret)
			return ret;
	}
	ret = sys_ptrace(request, pid, addr, (unsigned long)si);
	if (ret)
		return ret;
	if (request == PTRACE_GETSIGINFO)
		ret = copy_siginfo_to_user32(si32, si);
	return ret;
}

asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
{
	struct task_struct *child;
@@ -208,9 +227,19 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
	__u32 val;

	switch (request) { 
	default:
	case PTRACE_TRACEME:
	case PTRACE_ATTACH:
	case PTRACE_KILL:
	case PTRACE_CONT:
	case PTRACE_SINGLESTEP:
	case PTRACE_DETACH:
	case PTRACE_SYSCALL:
	case PTRACE_SETOPTIONS:
		return sys_ptrace(request, pid, addr, data); 

	default:
		return -EINVAL;

	case PTRACE_PEEKTEXT:
	case PTRACE_PEEKDATA:
	case PTRACE_POKEDATA:
@@ -225,10 +254,11 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
	case PTRACE_GETFPXREGS:
	case PTRACE_GETEVENTMSG:
		break;
	} 

	if (request == PTRACE_TRACEME)
		return ptrace_traceme();
	case PTRACE_SETSIGINFO:
	case PTRACE_GETSIGINFO:
		return ptrace32_siginfo(request, pid, addr, data);
	}

	child = ptrace_get_task_struct(pid);
	if (IS_ERR(child))
@@ -349,8 +379,7 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
		break;

	default:
		ret = -EINVAL;
		break;
		BUG();
	}

 out: