x86: compat_ptrace_request
This adds a compat_ptrace_request that is the analogue of ptrace_request for the things that 32-on-64 ptrace implementations can share in common. So far there are just a couple of requests handled generically. Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
					parent
					
						
							
								16c3e389e7
							
						
					
				
			
			
				commit
				
					
						032d82d906
					
				
			
		
					 2 changed files with 42 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -243,6 +243,10 @@ asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
 | 
			
		|||
		compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
 | 
			
		||||
		const compat_ulong_t __user *new_nodes);
 | 
			
		||||
 | 
			
		||||
extern int compat_ptrace_request(struct task_struct *child,
 | 
			
		||||
				 compat_long_t request,
 | 
			
		||||
				 compat_ulong_t addr, compat_ulong_t data);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * epoll (fs/eventpoll.c) compat bits follow ...
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -607,3 +607,41 @@ int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data)
 | 
			
		|||
	copied = access_process_vm(tsk, addr, &data, sizeof(data), 1);
 | 
			
		||||
	return (copied == sizeof(data)) ? 0 : -EIO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_COMPAT
 | 
			
		||||
#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;
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		ret = ptrace_request(child, request, addr, data);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif	/* CONFIG_COMPAT */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue