[NET]: allow 32 bit socket ioctl in 64 bit kernel
Since the register_ioctl32_conversion() patch in the kernel is now obsolete, provide another method to allow 32 bit user space ioctls to reach the kernel. Signed-off-by: Shaun Pereira <spereira@tusc.com.au> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
67b52e554b
commit
89bbfc95d6
|
@ -143,6 +143,8 @@ struct proto_ops {
|
|||
struct poll_table_struct *wait);
|
||||
int (*ioctl) (struct socket *sock, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
int (*compat_ioctl) (struct socket *sock, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
int (*listen) (struct socket *sock, int len);
|
||||
int (*shutdown) (struct socket *sock, int flags);
|
||||
int (*setsockopt)(struct socket *sock, int level,
|
||||
|
@ -251,6 +253,8 @@ SOCKCALL_UWRAP(name, poll, (struct file *file, struct socket *sock, struct poll_
|
|||
(file, sock, wait)) \
|
||||
SOCKCALL_WRAP(name, ioctl, (struct socket *sock, unsigned int cmd, \
|
||||
unsigned long arg), (sock, cmd, arg)) \
|
||||
SOCKCALL_WRAP(name, compat_ioctl, (struct socket *sock, unsigned int cmd, \
|
||||
unsigned long arg), (sock, cmd, arg)) \
|
||||
SOCKCALL_WRAP(name, listen, (struct socket *sock, int len), (sock, len)) \
|
||||
SOCKCALL_WRAP(name, shutdown, (struct socket *sock, int flags), (sock, flags)) \
|
||||
SOCKCALL_WRAP(name, setsockopt, (struct socket *sock, int level, int optname, \
|
||||
|
@ -275,6 +279,7 @@ static const struct proto_ops name##_ops = { \
|
|||
.getname = __lock_##name##_getname, \
|
||||
.poll = __lock_##name##_poll, \
|
||||
.ioctl = __lock_##name##_ioctl, \
|
||||
.compat_ioctl = __lock_##name##_compat_ioctl, \
|
||||
.listen = __lock_##name##_listen, \
|
||||
.shutdown = __lock_##name##_shutdown, \
|
||||
.setsockopt = __lock_##name##_setsockopt, \
|
||||
|
@ -283,6 +288,7 @@ static const struct proto_ops name##_ops = { \
|
|||
.recvmsg = __lock_##name##_recvmsg, \
|
||||
.mmap = __lock_##name##_mmap, \
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#define MODULE_ALIAS_NETPROTO(proto) \
|
||||
|
|
21
net/socket.c
21
net/socket.c
|
@ -107,6 +107,10 @@ static unsigned int sock_poll(struct file *file,
|
|||
struct poll_table_struct *wait);
|
||||
static long sock_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long compat_sock_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
#endif
|
||||
static int sock_fasync(int fd, struct file *filp, int on);
|
||||
static ssize_t sock_readv(struct file *file, const struct iovec *vector,
|
||||
unsigned long count, loff_t *ppos);
|
||||
|
@ -128,6 +132,9 @@ static struct file_operations socket_file_ops = {
|
|||
.aio_write = sock_aio_write,
|
||||
.poll = sock_poll,
|
||||
.unlocked_ioctl = sock_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = compat_sock_ioctl,
|
||||
#endif
|
||||
.mmap = sock_mmap,
|
||||
.open = sock_no_open, /* special open code to disallow open via /proc */
|
||||
.release = sock_close,
|
||||
|
@ -2136,6 +2143,20 @@ void socket_seq_show(struct seq_file *seq)
|
|||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long compat_sock_ioctl(struct file *file, unsigned cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct socket *sock = file->private_data;
|
||||
int ret = -ENOIOCTLCMD;
|
||||
|
||||
if (sock->ops->compat_ioctl)
|
||||
ret = sock->ops->compat_ioctl(sock, cmd, arg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ABI emulation layers need these two */
|
||||
EXPORT_SYMBOL(move_addr_to_kernel);
|
||||
EXPORT_SYMBOL(move_addr_to_user);
|
||||
|
|
Loading…
Reference in New Issue