diff options
-rw-r--r-- | include/net/inet_connection_sock.h | 5 | ||||
-rw-r--r-- | net/dccp/proto.c | 23 | ||||
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 30 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 26 |
4 files changed, 48 insertions, 36 deletions
diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index ae61331366f..9bf73fe5094 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h | |||
@@ -331,4 +331,9 @@ extern int inet_csk_ctl_sock_create(struct socket **sock, | |||
331 | unsigned short family, | 331 | unsigned short family, |
332 | unsigned short type, | 332 | unsigned short type, |
333 | unsigned char protocol); | 333 | unsigned char protocol); |
334 | |||
335 | extern int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname, | ||
336 | char __user *optval, int __user *optlen); | ||
337 | extern int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname, | ||
338 | char __user *optval, int optlen); | ||
334 | #endif /* _INET_CONNECTION_SOCK_H */ | 339 | #endif /* _INET_CONNECTION_SOCK_H */ |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 59b214995f2..6d7aef9647d 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -522,14 +522,10 @@ EXPORT_SYMBOL_GPL(dccp_setsockopt); | |||
522 | int compat_dccp_setsockopt(struct sock *sk, int level, int optname, | 522 | int compat_dccp_setsockopt(struct sock *sk, int level, int optname, |
523 | char __user *optval, int optlen) | 523 | char __user *optval, int optlen) |
524 | { | 524 | { |
525 | if (level != SOL_DCCP) { | 525 | if (level != SOL_DCCP) |
526 | if (inet_csk(sk)->icsk_af_ops->compat_setsockopt) | 526 | return inet_csk_compat_setsockopt(sk, level, optname, |
527 | return inet_csk(sk)->icsk_af_ops->compat_setsockopt(sk, | 527 | optval, optlen); |
528 | level, optname, optval, optlen); | 528 | |
529 | else | ||
530 | return inet_csk(sk)->icsk_af_ops->setsockopt(sk, | ||
531 | level, optname, optval, optlen); | ||
532 | } | ||
533 | return do_dccp_setsockopt(sk, level, optname, optval, optlen); | 529 | return do_dccp_setsockopt(sk, level, optname, optval, optlen); |
534 | } | 530 | } |
535 | EXPORT_SYMBOL_GPL(compat_dccp_setsockopt); | 531 | EXPORT_SYMBOL_GPL(compat_dccp_setsockopt); |
@@ -619,14 +615,9 @@ EXPORT_SYMBOL_GPL(dccp_getsockopt); | |||
619 | int compat_dccp_getsockopt(struct sock *sk, int level, int optname, | 615 | int compat_dccp_getsockopt(struct sock *sk, int level, int optname, |
620 | char __user *optval, int __user *optlen) | 616 | char __user *optval, int __user *optlen) |
621 | { | 617 | { |
622 | if (level != SOL_DCCP) { | 618 | if (level != SOL_DCCP) |
623 | if (inet_csk(sk)->icsk_af_ops->compat_setsockopt) | 619 | return inet_csk_compat_getsockopt(sk, level, optname, |
624 | return inet_csk(sk)->icsk_af_ops->compat_getsockopt(sk, | 620 | optval, optlen); |
625 | level, optname, optval, optlen); | ||
626 | else | ||
627 | return inet_csk(sk)->icsk_af_ops->getsockopt(sk, | ||
628 | level, optname, optval, optlen); | ||
629 | } | ||
630 | return do_dccp_getsockopt(sk, level, optname, optval, optlen); | 621 | return do_dccp_getsockopt(sk, level, optname, optval, optlen); |
631 | } | 622 | } |
632 | EXPORT_SYMBOL_GPL(compat_dccp_getsockopt); | 623 | EXPORT_SYMBOL_GPL(compat_dccp_getsockopt); |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 359f48cec99..9f6b44ca28a 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -667,3 +667,33 @@ int inet_csk_ctl_sock_create(struct socket **sock, unsigned short family, | |||
667 | } | 667 | } |
668 | 668 | ||
669 | EXPORT_SYMBOL_GPL(inet_csk_ctl_sock_create); | 669 | EXPORT_SYMBOL_GPL(inet_csk_ctl_sock_create); |
670 | |||
671 | #ifdef CONFIG_COMPAT | ||
672 | int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname, | ||
673 | char __user *optval, int __user *optlen) | ||
674 | { | ||
675 | const struct inet_csk *icsk = inet_csk(sk); | ||
676 | |||
677 | if (icsk->icsk_af_ops->compat_getsockopt != NULL) | ||
678 | return icsk->icsk_af_ops->compat_getsockopt(sk, level, optname, | ||
679 | optval, optlen); | ||
680 | return icsk->icsk_af_ops->getsockopt(sk, level, optname, | ||
681 | optval, optlen); | ||
682 | } | ||
683 | |||
684 | EXPORT_SYMBOL_GPL(inet_csk_compat_getsockopt); | ||
685 | |||
686 | int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname, | ||
687 | char __user *optval, int optlen) | ||
688 | { | ||
689 | const struct inet_csk *icsk = inet_csk(sk); | ||
690 | |||
691 | if (icsk->icsk_af_ops->compat_setsockopt != NULL) | ||
692 | return icsk->icsk_af_ops->compat_setsockopt(sk, level, optname, | ||
693 | optval, optlen); | ||
694 | return icsk->icsk_af_ops->setsockopt(sk, level, optname, | ||
695 | optval, optlen); | ||
696 | } | ||
697 | |||
698 | EXPORT_SYMBOL_GPL(inet_csk_compat_setsockopt); | ||
699 | #endif | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 31b0123a969..89da253e33f 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1882,16 +1882,9 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, | |||
1882 | int compat_tcp_setsockopt(struct sock *sk, int level, | 1882 | int compat_tcp_setsockopt(struct sock *sk, int level, |
1883 | int optname, char __user *optval, int optlen) | 1883 | int optname, char __user *optval, int optlen) |
1884 | { | 1884 | { |
1885 | struct inet_connection_sock *icsk = inet_csk(sk); | 1885 | if (level != SOL_TCP) |
1886 | 1886 | return inet_csk_compat_setsockopt(sk, level, optname, | |
1887 | if (level != SOL_TCP) { | 1887 | optval, optlen); |
1888 | if (icsk->icsk_af_ops->compat_setsockopt) | ||
1889 | return icsk->icsk_af_ops->compat_setsockopt(sk, | ||
1890 | level, optname, optval, optlen); | ||
1891 | else | ||
1892 | return icsk->icsk_af_ops->setsockopt(sk, | ||
1893 | level, optname, optval, optlen); | ||
1894 | } | ||
1895 | return do_tcp_setsockopt(sk, level, optname, optval, optlen); | 1888 | return do_tcp_setsockopt(sk, level, optname, optval, optlen); |
1896 | } | 1889 | } |
1897 | #endif | 1890 | #endif |
@@ -2061,16 +2054,9 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, | |||
2061 | int compat_tcp_getsockopt(struct sock *sk, int level, | 2054 | int compat_tcp_getsockopt(struct sock *sk, int level, |
2062 | int optname, char __user *optval, int __user *optlen) | 2055 | int optname, char __user *optval, int __user *optlen) |
2063 | { | 2056 | { |
2064 | struct inet_connection_sock *icsk = inet_csk(sk); | 2057 | if (level != SOL_TCP) |
2065 | 2058 | return inet_csk_compat_getsockopt(sk, level, optname, | |
2066 | if (level != SOL_TCP) { | 2059 | optval, optlen); |
2067 | if (icsk->icsk_af_ops->compat_getsockopt) | ||
2068 | return icsk->icsk_af_ops->compat_getsockopt(sk, | ||
2069 | level, optname, optval, optlen); | ||
2070 | else | ||
2071 | return icsk->icsk_af_ops->getsockopt(sk, | ||
2072 | level, optname, optval, optlen); | ||
2073 | } | ||
2074 | return do_tcp_getsockopt(sk, level, optname, optval, optlen); | 2060 | return do_tcp_getsockopt(sk, level, optname, optval, optlen); |
2075 | } | 2061 | } |
2076 | #endif | 2062 | #endif |