|
@@ -2005,12 +2005,9 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
|
if (!sock)
|
|
if (!sock)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
- err = sock_error(sock->sk);
|
|
|
|
- if (err)
|
|
|
|
- goto out_put;
|
|
|
|
-
|
|
|
|
entry = mmsg;
|
|
entry = mmsg;
|
|
compat_entry = (struct compat_mmsghdr __user *)mmsg;
|
|
compat_entry = (struct compat_mmsghdr __user *)mmsg;
|
|
|
|
+ err = 0;
|
|
|
|
|
|
while (datagrams < vlen) {
|
|
while (datagrams < vlen) {
|
|
/*
|
|
/*
|
|
@@ -2037,29 +2034,11 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
|
|
++datagrams;
|
|
++datagrams;
|
|
}
|
|
}
|
|
|
|
|
|
-out_put:
|
|
|
|
fput_light(sock->file, fput_needed);
|
|
fput_light(sock->file, fput_needed);
|
|
|
|
|
|
- if (err == 0)
|
|
|
|
- return datagrams;
|
|
|
|
-
|
|
|
|
- if (datagrams != 0) {
|
|
|
|
- /*
|
|
|
|
- * We may send less entries than requested (vlen) if the
|
|
|
|
- * sock is non blocking...
|
|
|
|
- */
|
|
|
|
- if (err != -EAGAIN) {
|
|
|
|
- /*
|
|
|
|
- * ... or if sendmsg returns an error after we
|
|
|
|
- * send some datagrams, where we record the
|
|
|
|
- * error to return on the next call or if the
|
|
|
|
- * app asks about it using getsockopt(SO_ERROR).
|
|
|
|
- */
|
|
|
|
- sock->sk->sk_err = -err;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ /* We only return an error if no datagrams were able to be sent */
|
|
|
|
+ if (datagrams != 0)
|
|
return datagrams;
|
|
return datagrams;
|
|
- }
|
|
|
|
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|