[ARM] 3308/1: old ABI compat: struct sockaddr_un
Patch from Nicolas Pitre 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 change the length argument to 110 whenever it is 112. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Родитель
a73a3ff127
Коммит
99595d0237
|
@ -291,21 +291,21 @@
|
|||
CALL(sys_mq_getsetattr)
|
||||
/* 280 */ CALL(sys_waitid)
|
||||
CALL(sys_socket)
|
||||
CALL(sys_bind)
|
||||
CALL(sys_connect)
|
||||
CALL(ABI(sys_bind, sys_oabi_bind))
|
||||
CALL(ABI(sys_connect, sys_oabi_connect))
|
||||
CALL(sys_listen)
|
||||
/* 285 */ CALL(sys_accept)
|
||||
CALL(sys_getsockname)
|
||||
CALL(sys_getpeername)
|
||||
CALL(sys_socketpair)
|
||||
CALL(sys_send)
|
||||
/* 290 */ CALL(sys_sendto)
|
||||
/* 290 */ CALL(ABI(sys_sendto, sys_oabi_sendto))
|
||||
CALL(sys_recv)
|
||||
CALL(sys_recvfrom)
|
||||
CALL(sys_shutdown)
|
||||
CALL(sys_setsockopt)
|
||||
/* 295 */ CALL(sys_getsockopt)
|
||||
CALL(sys_sendmsg)
|
||||
CALL(ABI(sys_sendmsg, sys_oabi_sendmsg))
|
||||
CALL(sys_recvmsg)
|
||||
CALL(ABI(sys_semop, sys_oabi_semop))
|
||||
CALL(sys_semget)
|
||||
|
|
|
@ -59,6 +59,16 @@
|
|||
* struct sembuf loses its padding with EABI. Since arrays of them are
|
||||
* used they have to be copyed to remove the padding. Compatibility wrappers
|
||||
* provided below.
|
||||
*
|
||||
* sys_bind:
|
||||
* sys_connect:
|
||||
* sys_sendmsg:
|
||||
* sys_sendto:
|
||||
*
|
||||
* 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
|
||||
* change the length argument to 110 whenever it is 112. Compatibility
|
||||
* wrappers provided below.
|
||||
*/
|
||||
|
||||
#include <linux/syscalls.h>
|
||||
|
@ -67,6 +77,7 @@
|
|||
#include <linux/fcntl.h>
|
||||
#include <linux/eventpoll.h>
|
||||
#include <linux/sem.h>
|
||||
#include <linux/socket.h>
|
||||
#include <asm/ipc.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
|
@ -337,3 +348,63 @@ asmlinkage int sys_oabi_ipc(uint call, int first, int second, int third,
|
|||
return sys_ipc(call, first, second, third, ptr, fifth);
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage long sys_oabi_bind(int fd, struct sockaddr __user *addr, int addrlen)
|
||||
{
|
||||
sa_family_t sa_family;
|
||||
if (addrlen == 112 &&
|
||||
get_user(sa_family, &addr->sa_family) == 0 &&
|
||||
sa_family == AF_UNIX)
|
||||
addrlen = 110;
|
||||
return sys_bind(fd, addr, addrlen);
|
||||
}
|
||||
|
||||
asmlinkage long sys_oabi_connect(int fd, struct sockaddr __user *addr, int addrlen)
|
||||
{
|
||||
sa_family_t sa_family;
|
||||
if (addrlen == 112 &&
|
||||
get_user(sa_family, &addr->sa_family) == 0 &&
|
||||
sa_family == AF_UNIX)
|
||||
addrlen = 110;
|
||||
return sys_connect(fd, addr, addrlen);
|
||||
}
|
||||
|
||||
asmlinkage long sys_oabi_sendto(int fd, void __user *buff,
|
||||
size_t len, unsigned flags,
|
||||
struct sockaddr __user *addr,
|
||||
int addrlen)
|
||||
{
|
||||
sa_family_t sa_family;
|
||||
if (addrlen == 112 &&
|
||||
get_user(sa_family, &addr->sa_family) == 0 &&
|
||||
sa_family == AF_UNIX)
|
||||
addrlen = 110;
|
||||
return sys_sendto(fd, buff, len, flags, addr, addrlen);
|
||||
}
|
||||
|
||||
asmlinkage long sys_oabi_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
|
||||
{
|
||||
struct sockaddr __user *addr;
|
||||
int msg_namelen;
|
||||
sa_family_t sa_family;
|
||||
if (msg &&
|
||||
get_user(msg_namelen, &msg->msg_namelen) == 0 &&
|
||||
msg_namelen == 112 &&
|
||||
get_user(addr, &msg->msg_name) == 0 &&
|
||||
get_user(sa_family, &addr->sa_family) == 0 &&
|
||||
sa_family == AF_UNIX)
|
||||
{
|
||||
/*
|
||||
* HACK ALERT: there is a limit to how much backward bending
|
||||
* we should do for what is actually a transitional
|
||||
* compatibility layer. This already has known flaws with
|
||||
* a few ioctls that we don't intend to fix. Therefore
|
||||
* consider this blatent hack as another one... and take care
|
||||
* to run for cover. In most cases it will "just work fine".
|
||||
* If it doesn't, well, tough.
|
||||
*/
|
||||
put_user(110, &msg->msg_namelen);
|
||||
}
|
||||
return sys_sendmsg(fd, msg, flags);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче