diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index 645677f84dba..699f7f6cc0b8 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c @@ -791,33 +791,39 @@ static int llcp_sock_sendmsg(struct socket *sock, struct msghdr *msg, lock_sock(sk); if (!llcp_sock->local) { - release_sock(sk); - return -ENODEV; + ret = -ENODEV; + goto out; } if (sk->sk_type == SOCK_DGRAM) { + if (sk->sk_state != LLCP_BOUND) { + ret = -ENOLINK; + goto out; + } + DECLARE_SOCKADDR(struct sockaddr_nfc_llcp *, addr, msg->msg_name); if (msg->msg_namelen < sizeof(*addr)) { - release_sock(sk); - return -EINVAL; + ret = -EINVAL; + goto out; } - release_sock(sk); - - return nfc_llcp_send_ui_frame(llcp_sock, addr->dsap, addr->ssap, - msg, len); + ret = nfc_llcp_send_ui_frame(llcp_sock, addr->dsap, addr->ssap, + msg, len); + goto out; } if (sk->sk_state != LLCP_CONNECTED) { - release_sock(sk); - return -ENOTCONN; + ret = -ENOTCONN; + goto out; } - release_sock(sk); + ret = nfc_llcp_send_i_frame(llcp_sock, msg, len); - return nfc_llcp_send_i_frame(llcp_sock, msg, len); +out: + release_sock(sk); + return ret; } static int llcp_sock_recvmsg(struct socket *sock, struct msghdr *msg,