|
@@ -1501,6 +1501,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
|
struct sk_buff *skb;
|
|
struct sk_buff *skb;
|
|
int sent = 0;
|
|
int sent = 0;
|
|
struct scm_cookie tmp_scm;
|
|
struct scm_cookie tmp_scm;
|
|
|
|
+ bool fds_sent = false;
|
|
|
|
|
|
if (NULL == siocb->scm)
|
|
if (NULL == siocb->scm)
|
|
siocb->scm = &tmp_scm;
|
|
siocb->scm = &tmp_scm;
|
|
@@ -1562,12 +1563,14 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
|
size = min_t(int, size, skb_tailroom(skb));
|
|
size = min_t(int, size, skb_tailroom(skb));
|
|
|
|
|
|
memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
|
|
memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
|
|
- if (siocb->scm->fp) {
|
|
|
|
|
|
+ /* Only send the fds in the first buffer */
|
|
|
|
+ if (siocb->scm->fp && !fds_sent) {
|
|
err = unix_attach_fds(siocb->scm, skb);
|
|
err = unix_attach_fds(siocb->scm, skb);
|
|
if (err) {
|
|
if (err) {
|
|
kfree_skb(skb);
|
|
kfree_skb(skb);
|
|
goto out_err;
|
|
goto out_err;
|
|
}
|
|
}
|
|
|
|
+ fds_sent = true;
|
|
}
|
|
}
|
|
|
|
|
|
err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
|
|
err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
|