commit e370a723632 ("af_unix: improve STREAM behavior with fragmented memory") added a bug on large send() because the skb_copy_datagram_from_iovec() call always start from the beginning of iovec. We must instead use the @sent variable to properly skip the already processed part.
Unified · Split
| @@ -1669,7 +1669,8 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, · 1668 unmodified lines | |||
| 1669 | skb_put(skb, size - data_len); | 1669 | skb_put(skb, size - data_len); |
| 1670 | skb->data_len = data_len; | 1670 | skb->data_len = data_len; |
| 1671 | skb->len = size; | 1671 | skb->len = size; |
| 1672 | err = skb_copy_datagram_from_iovec(skb, 0, msg->msg_iov, 0, size); | 1672 | err = skb_copy_datagram_from_iovec(skb, 0, msg->msg_iov, |
| 1673 | sent, size); | ||
| 1673 | if (err) { | 1674 | if (err) { |
| 1674 | kfree_skb(skb); | 1675 | kfree_skb(skb); |
| 1675 | goto out_err; | 1676 | goto out_err; |