aboutsummaryrefslogtreecommitdiffstats
path: root/net/irda
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/irda
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/irda')
-rw-r--r--net/irda/af_irda.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
index 627b11342233..2f37c9f35e27 100644
--- a/net/irda/af_irda.c
+++ b/net/irda/af_irda.c
@@ -1830,6 +1830,19 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1830 return 0; 1830 return 0;
1831} 1831}
1832 1832
1833#ifdef CONFIG_COMPAT
1834/*
1835 * Function irda_ioctl (sock, cmd, arg)
1836 */
1837static int irda_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1838{
1839 /*
1840 * All IRDA's ioctl are standard ones.
1841 */
1842 return -ENOIOCTLCMD;
1843}
1844#endif
1845
1833/* 1846/*
1834 * Function irda_setsockopt (sock, level, optname, optval, optlen) 1847 * Function irda_setsockopt (sock, level, optname, optval, optlen)
1835 * 1848 *
@@ -2476,6 +2489,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_stream_ops) = {
2476 .getname = irda_getname, 2489 .getname = irda_getname,
2477 .poll = irda_poll, 2490 .poll = irda_poll,
2478 .ioctl = irda_ioctl, 2491 .ioctl = irda_ioctl,
2492#ifdef CONFIG_COMPAT
2493 .compat_ioctl = irda_compat_ioctl,
2494#endif
2479 .listen = irda_listen, 2495 .listen = irda_listen,
2480 .shutdown = irda_shutdown, 2496 .shutdown = irda_shutdown,
2481 .setsockopt = irda_setsockopt, 2497 .setsockopt = irda_setsockopt,
@@ -2497,6 +2513,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_seqpacket_ops) = {
2497 .getname = irda_getname, 2513 .getname = irda_getname,
2498 .poll = datagram_poll, 2514 .poll = datagram_poll,
2499 .ioctl = irda_ioctl, 2515 .ioctl = irda_ioctl,
2516#ifdef CONFIG_COMPAT
2517 .compat_ioctl = irda_compat_ioctl,
2518#endif
2500 .listen = irda_listen, 2519 .listen = irda_listen,
2501 .shutdown = irda_shutdown, 2520 .shutdown = irda_shutdown,
2502 .setsockopt = irda_setsockopt, 2521 .setsockopt = irda_setsockopt,
@@ -2518,6 +2537,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_dgram_ops) = {
2518 .getname = irda_getname, 2537 .getname = irda_getname,
2519 .poll = datagram_poll, 2538 .poll = datagram_poll,
2520 .ioctl = irda_ioctl, 2539 .ioctl = irda_ioctl,
2540#ifdef CONFIG_COMPAT
2541 .compat_ioctl = irda_compat_ioctl,
2542#endif
2521 .listen = irda_listen, 2543 .listen = irda_listen,
2522 .shutdown = irda_shutdown, 2544 .shutdown = irda_shutdown,
2523 .setsockopt = irda_setsockopt, 2545 .setsockopt = irda_setsockopt,
@@ -2540,6 +2562,9 @@ static const struct proto_ops SOCKOPS_WRAPPED(irda_ultra_ops) = {
2540 .getname = irda_getname, 2562 .getname = irda_getname,
2541 .poll = datagram_poll, 2563 .poll = datagram_poll,
2542 .ioctl = irda_ioctl, 2564 .ioctl = irda_ioctl,
2565#ifdef CONFIG_COMPAT
2566 .compat_ioctl = irda_compat_ioctl,
2567#endif
2543 .listen = sock_no_listen, 2568 .listen = sock_no_listen,
2544 .shutdown = irda_shutdown, 2569 .shutdown = irda_shutdown,
2545 .setsockopt = irda_setsockopt, 2570 .setsockopt = irda_setsockopt,