|
@@ -1048,6 +1048,7 @@ static int hci_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
struct sock *sk = sock->sk;
|
|
struct sock *sk = sock->sk;
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
int copied, err;
|
|
int copied, err;
|
|
|
|
+ unsigned int skblen;
|
|
|
|
|
|
BT_DBG("sock %p, sk %p", sock, sk);
|
|
BT_DBG("sock %p, sk %p", sock, sk);
|
|
|
|
|
|
@@ -1064,6 +1065,7 @@ static int hci_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
if (!skb)
|
|
if (!skb)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
|
|
+ skblen = skb->len;
|
|
copied = skb->len;
|
|
copied = skb->len;
|
|
if (len < copied) {
|
|
if (len < copied) {
|
|
msg->msg_flags |= MSG_TRUNC;
|
|
msg->msg_flags |= MSG_TRUNC;
|
|
@@ -1089,6 +1091,9 @@ static int hci_sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
|
|
|
|
skb_free_datagram(sk, skb);
|
|
skb_free_datagram(sk, skb);
|
|
|
|
|
|
|
|
+ if (msg->msg_flags & MSG_TRUNC)
|
|
|
|
+ copied = skblen;
|
|
|
|
+
|
|
return err ? : copied;
|
|
return err ? : copied;
|
|
}
|
|
}
|
|
|
|
|