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/irda | |
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/irda')
-rw-r--r-- | net/irda/af_irda.c | 25 |
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 | */ | ||
1837 | static 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, |