diff options
Diffstat (limited to 'net/x25')
-rw-r--r-- | net/x25/af_x25.c | 34 |
1 files changed, 10 insertions, 24 deletions
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index 5e86d4e97dce..f7af98dff409 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c | |||
@@ -507,14 +507,14 @@ static int x25_listen(struct socket *sock, int backlog) | |||
507 | struct sock *sk = sock->sk; | 507 | struct sock *sk = sock->sk; |
508 | int rc = -EOPNOTSUPP; | 508 | int rc = -EOPNOTSUPP; |
509 | 509 | ||
510 | lock_kernel(); | 510 | lock_sock(sk); |
511 | if (sk->sk_state != TCP_LISTEN) { | 511 | if (sk->sk_state != TCP_LISTEN) { |
512 | memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN); | 512 | memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN); |
513 | sk->sk_max_ack_backlog = backlog; | 513 | sk->sk_max_ack_backlog = backlog; |
514 | sk->sk_state = TCP_LISTEN; | 514 | sk->sk_state = TCP_LISTEN; |
515 | rc = 0; | 515 | rc = 0; |
516 | } | 516 | } |
517 | unlock_kernel(); | 517 | release_sock(sk); |
518 | 518 | ||
519 | return rc; | 519 | return rc; |
520 | } | 520 | } |
@@ -688,7 +688,6 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
688 | struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr; | 688 | struct sockaddr_x25 *addr = (struct sockaddr_x25 *)uaddr; |
689 | int len, i, rc = 0; | 689 | int len, i, rc = 0; |
690 | 690 | ||
691 | lock_kernel(); | ||
692 | if (!sock_flag(sk, SOCK_ZAPPED) || | 691 | if (!sock_flag(sk, SOCK_ZAPPED) || |
693 | addr_len != sizeof(struct sockaddr_x25) || | 692 | addr_len != sizeof(struct sockaddr_x25) || |
694 | addr->sx25_family != AF_X25) { | 693 | addr->sx25_family != AF_X25) { |
@@ -704,12 +703,13 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
704 | } | 703 | } |
705 | } | 704 | } |
706 | 705 | ||
706 | lock_sock(sk); | ||
707 | x25_sk(sk)->source_addr = addr->sx25_addr; | 707 | x25_sk(sk)->source_addr = addr->sx25_addr; |
708 | x25_insert_socket(sk); | 708 | x25_insert_socket(sk); |
709 | sock_reset_flag(sk, SOCK_ZAPPED); | 709 | sock_reset_flag(sk, SOCK_ZAPPED); |
710 | release_sock(sk); | ||
710 | SOCK_DEBUG(sk, "x25_bind: socket is bound\n"); | 711 | SOCK_DEBUG(sk, "x25_bind: socket is bound\n"); |
711 | out: | 712 | out: |
712 | unlock_kernel(); | ||
713 | return rc; | 713 | return rc; |
714 | } | 714 | } |
715 | 715 | ||
@@ -751,7 +751,6 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr, | |||
751 | struct x25_route *rt; | 751 | struct x25_route *rt; |
752 | int rc = 0; | 752 | int rc = 0; |
753 | 753 | ||
754 | lock_kernel(); | ||
755 | lock_sock(sk); | 754 | lock_sock(sk); |
756 | if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) { | 755 | if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) { |
757 | sock->state = SS_CONNECTED; | 756 | sock->state = SS_CONNECTED; |
@@ -829,7 +828,6 @@ out_put_route: | |||
829 | x25_route_put(rt); | 828 | x25_route_put(rt); |
830 | out: | 829 | out: |
831 | release_sock(sk); | 830 | release_sock(sk); |
832 | unlock_kernel(); | ||
833 | return rc; | 831 | return rc; |
834 | } | 832 | } |
835 | 833 | ||
@@ -869,8 +867,7 @@ static int x25_accept(struct socket *sock, struct socket *newsock, int flags) | |||
869 | struct sk_buff *skb; | 867 | struct sk_buff *skb; |
870 | int rc = -EINVAL; | 868 | int rc = -EINVAL; |
871 | 869 | ||
872 | lock_kernel(); | 870 | if (!sk) |
873 | if (!sk || sk->sk_state != TCP_LISTEN) | ||
874 | goto out; | 871 | goto out; |
875 | 872 | ||
876 | rc = -EOPNOTSUPP; | 873 | rc = -EOPNOTSUPP; |
@@ -878,6 +875,10 @@ static int x25_accept(struct socket *sock, struct socket *newsock, int flags) | |||
878 | goto out; | 875 | goto out; |
879 | 876 | ||
880 | lock_sock(sk); | 877 | lock_sock(sk); |
878 | rc = -EINVAL; | ||
879 | if (sk->sk_state != TCP_LISTEN) | ||
880 | goto out2; | ||
881 | |||
881 | rc = x25_wait_for_data(sk, sk->sk_rcvtimeo); | 882 | rc = x25_wait_for_data(sk, sk->sk_rcvtimeo); |
882 | if (rc) | 883 | if (rc) |
883 | goto out2; | 884 | goto out2; |
@@ -897,7 +898,6 @@ static int x25_accept(struct socket *sock, struct socket *newsock, int flags) | |||
897 | out2: | 898 | out2: |
898 | release_sock(sk); | 899 | release_sock(sk); |
899 | out: | 900 | out: |
900 | unlock_kernel(); | ||
901 | return rc; | 901 | return rc; |
902 | } | 902 | } |
903 | 903 | ||
@@ -909,7 +909,6 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr, | |||
909 | struct x25_sock *x25 = x25_sk(sk); | 909 | struct x25_sock *x25 = x25_sk(sk); |
910 | int rc = 0; | 910 | int rc = 0; |
911 | 911 | ||
912 | lock_kernel(); | ||
913 | if (peer) { | 912 | if (peer) { |
914 | if (sk->sk_state != TCP_ESTABLISHED) { | 913 | if (sk->sk_state != TCP_ESTABLISHED) { |
915 | rc = -ENOTCONN; | 914 | rc = -ENOTCONN; |
@@ -923,19 +922,6 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr, | |||
923 | *uaddr_len = sizeof(*sx25); | 922 | *uaddr_len = sizeof(*sx25); |
924 | 923 | ||
925 | out: | 924 | out: |
926 | unlock_kernel(); | ||
927 | return rc; | ||
928 | } | ||
929 | |||
930 | static unsigned int x25_datagram_poll(struct file *file, struct socket *sock, | ||
931 | poll_table *wait) | ||
932 | { | ||
933 | int rc; | ||
934 | |||
935 | lock_kernel(); | ||
936 | rc = datagram_poll(file, sock, wait); | ||
937 | unlock_kernel(); | ||
938 | |||
939 | return rc; | 925 | return rc; |
940 | } | 926 | } |
941 | 927 | ||
@@ -1746,7 +1732,7 @@ static const struct proto_ops x25_proto_ops = { | |||
1746 | .socketpair = sock_no_socketpair, | 1732 | .socketpair = sock_no_socketpair, |
1747 | .accept = x25_accept, | 1733 | .accept = x25_accept, |
1748 | .getname = x25_getname, | 1734 | .getname = x25_getname, |
1749 | .poll = x25_datagram_poll, | 1735 | .poll = datagram_poll, |
1750 | .ioctl = x25_ioctl, | 1736 | .ioctl = x25_ioctl, |
1751 | #ifdef CONFIG_COMPAT | 1737 | #ifdef CONFIG_COMPAT |
1752 | .compat_ioctl = compat_x25_ioctl, | 1738 | .compat_ioctl = compat_x25_ioctl, |