|
@@ -1764,6 +1764,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
struct ipxhdr *ipx = NULL;
|
|
|
struct sk_buff *skb;
|
|
|
int copied, rc;
|
|
|
+ bool locked = true;
|
|
|
|
|
|
lock_sock(sk);
|
|
|
/* put the autobinding in */
|
|
@@ -1790,6 +1791,8 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
if (sock_flag(sk, SOCK_ZAPPED))
|
|
|
goto out;
|
|
|
|
|
|
+ release_sock(sk);
|
|
|
+ locked = false;
|
|
|
skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
|
|
|
flags & MSG_DONTWAIT, &rc);
|
|
|
if (!skb) {
|
|
@@ -1826,7 +1829,8 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|
|
out_free:
|
|
|
skb_free_datagram(sk, skb);
|
|
|
out:
|
|
|
- release_sock(sk);
|
|
|
+ if (locked)
|
|
|
+ release_sock(sk);
|
|
|
return rc;
|
|
|
}
|
|
|
|