[ARM] 3338/1: old ABI compat: sys_socketcall

Patch from Nicolas Pitre

Commit 99595d0237 forgot to intercept
sys_socketcall as well.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Nicolas Pitre 2006-02-16 22:36:13 +00:00 committed by Russell King
parent 3dfaf7a68e
commit 6c0fa49b18
2 changed files with 31 additions and 1 deletions

View File

@ -111,7 +111,7 @@
CALL(sys_statfs) CALL(sys_statfs)
/* 100 */ CALL(sys_fstatfs) /* 100 */ CALL(sys_fstatfs)
CALL(sys_ni_syscall) CALL(sys_ni_syscall)
CALL(OBSOLETE(sys_socketcall)) CALL(OBSOLETE(ABI(sys_socketcall, sys_oabi_socketcall)))
CALL(sys_syslog) CALL(sys_syslog)
CALL(sys_setitimer) CALL(sys_setitimer)
/* 105 */ CALL(sys_getitimer) /* 105 */ CALL(sys_getitimer)

View File

@ -64,6 +64,7 @@
* sys_connect: * sys_connect:
* sys_sendmsg: * sys_sendmsg:
* sys_sendto: * sys_sendto:
* sys_socketcall:
* *
* struct sockaddr_un loses its padding with EABI. Since the size of the * struct sockaddr_un loses its padding with EABI. Since the size of the
* structure is used as a validation test in unix_mkname(), we need to * structure is used as a validation test in unix_mkname(), we need to
@ -78,6 +79,7 @@
#include <linux/eventpoll.h> #include <linux/eventpoll.h>
#include <linux/sem.h> #include <linux/sem.h>
#include <linux/socket.h> #include <linux/socket.h>
#include <linux/net.h>
#include <asm/ipc.h> #include <asm/ipc.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -408,3 +410,31 @@ asmlinkage long sys_oabi_sendmsg(int fd, struct msghdr __user *msg, unsigned fla
return sys_sendmsg(fd, msg, flags); return sys_sendmsg(fd, msg, flags);
} }
asmlinkage long sys_oabi_socketcall(int call, unsigned long __user *args)
{
unsigned long r = -EFAULT, a[6];
switch (call) {
case SYS_BIND:
if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
r = sys_oabi_bind(a[0], (struct sockaddr __user *)a[1], a[2]);
break;
case SYS_CONNECT:
if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
r = sys_oabi_connect(a[0], (struct sockaddr __user *)a[1], a[2]);
break;
case SYS_SENDTO:
if (copy_from_user(a, args, 6 * sizeof(long)) == 0)
r = sys_oabi_sendto(a[0], (void __user *)a[1], a[2], a[3],
(struct sockaddr __user *)a[4], a[5]);
break;
case SYS_SENDMSG:
if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
r = sys_oabi_sendmsg(a[0], (struct msghdr __user *)a[1], a[2]);
break;
default:
r = sys_socketcall(call, args);
}
return r;
}