diff options
| author | Petr Vandrovec <petr@vandrovec.name> | 2006-03-28 02:39:31 -0500 |
|---|---|---|
| committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-28 20:02:43 -0500 |
| commit | f6c90b71a355a0a4a22e1cfee5748617adc25a53 (patch) | |
| tree | 2fdbe51a57e25a781128ce4a8c85375201221ded /net/econet | |
| parent | f1465f7ea9e7aecba8e41d4aac9240f9b7fe2e24 (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.c | 16 |
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 | ||
| 697 | static 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 | |||
| 696 | static struct net_proto_family econet_family_ops = { | 709 | static 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, |
