aboutsummaryrefslogtreecommitdiffstats
path: root/net/econet
diff options
context:
space:
mode:
authorPetr Vandrovec <petr@vandrovec.name>2006-03-28 02:39:31 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-28 20:02:43 -0500
commitf6c90b71a355a0a4a22e1cfee5748617adc25a53 (patch)
tree2fdbe51a57e25a781128ce4a8c85375201221ded /net/econet
parentf1465f7ea9e7aecba8e41d4aac9240f9b7fe2e24 (diff)
[NET]: Fix ipx/econet/appletalk/irda ioctl crashes
Fix kernel oopses whenever somebody issues compatible ioctl on AppleTalk, Econet, IPX or IRDA socket. For AppleTalk/Econet/IRDA it restores state in which these sockets were before compat_ioctl was introduced to the socket ops, for IPX it implements support for 4 ioctls which were not implemented before - as these ioctls use structures which match between 32bit and 64bit userspace, no special code is needed, just call 64bit ioctl handler. Signed-off-by: Petr Vandrovec <petr@vandrovec.name> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/econet')
-rw-r--r--net/econet/af_econet.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/net/econet/af_econet.c b/net/econet/af_econet.c
index c792994d7952..0c4c83bb2a59 100644
--- a/net/econet/af_econet.c
+++ b/net/econet/af_econet.c
@@ -693,6 +693,19 @@ static int econet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg
693 return 0; 693 return 0;
694} 694}
695 695
696#ifdef CONFIG_COMPAT
697static int econet_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
698{
699 /*
700 * All ioctls provided by econet are standard. There is one gotcha, sockaddr_ec
701 * differs between 32bit and 64bit. Fortunately nobody in kernel uses portion
702 * of sockaddr which differs between 32bit and 64bit, so we do not need special
703 * handling.
704 */
705 return -ENOIOCTLCMD;
706}
707#endif
708
696static struct net_proto_family econet_family_ops = { 709static struct net_proto_family econet_family_ops = {
697 .family = PF_ECONET, 710 .family = PF_ECONET,
698 .create = econet_create, 711 .create = econet_create,
@@ -710,6 +723,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(econet_ops) = {
710 .getname = econet_getname, 723 .getname = econet_getname,
711 .poll = datagram_poll, 724 .poll = datagram_poll,
712 .ioctl = econet_ioctl, 725 .ioctl = econet_ioctl,
726#ifdef CONFIG_COMPAT
727 .compat_ioctl = econet_compat_ioctl,
728#endif
713 .listen = sock_no_listen, 729 .listen = sock_no_listen,
714 .shutdown = sock_no_shutdown, 730 .shutdown = sock_no_shutdown,
715 .setsockopt = sock_no_setsockopt, 731 .setsockopt = sock_no_setsockopt,