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

Commit 99595d02 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King
Browse files

[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: default avatarNicolas Pitre <nico@cam.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent a73a3ff1
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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)
+71 −0
Original line number Diff line number Diff line
@@ -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);
}