recvmmsg.2, sendmmsg.2: Point out that error handling is unreliable

If an error occurs after at least one message has been received,
recvmmsg() call succeeds, and returns the number of messages
received.  The error code is expected to be returned on a
subsequent call.  In the current implementation, however, the
error code can be overwritten in the meantime by an unrelated
network event on a socket, for example an incoming ICMP packet.

If an error occurs after at least one message has been sent,
sendmmsg() call succeeds, and returns the number of messages sent.
The error code is lost. The caller can retry the transmission,
starting at first failed message, but there is no guarantee that,
if an error is returned, it will be the same as the one that was
lost on the previous call.

Reference:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/net/socket.c

Signed-off-by: Nikola Forró <nforro@redhat.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Nikola Forró 2018-01-09 14:54:09 +01:00 committed by Michael Kerrisk
parent 78ab0c7ba9
commit 1851a42f1c
2 changed files with 18 additions and 0 deletions

View File

@ -160,6 +160,8 @@ In addition, the following error can occur:
.B EINVAL
.I timeout
is invalid.
.PP
See also BUGS.
.SH VERSIONS
The
.BR recvmmsg ()
@ -179,6 +181,14 @@ so that if up to
.I vlen\-1
datagrams are received before the timeout expires,
but then no further datagrams are received, the call will block forever.
.PP
If an error occurs after at least one message has been received,
the call succeeds, and returns the number of messages received.
The error code is expected to be returned on a subsequent call to
.BR recvmmsq ().
In the current implementation, however, the error code can be overwritten
in the meantime by an unrelated network event on a socket,
for example an incoming ICMP packet.
.SH EXAMPLE
.PP
The following program uses

View File

@ -134,6 +134,7 @@ is set to indicate the error.
Errors are as for
.BR sendmsg (2).
An error is returned only if no datagrams could be sent.
See also BUGS.
.\" commit 728ffb86f10873aaf4abd26dde691ee40ae731fe
.\" ... only return an error if no datagrams could be sent.
.\" If less than the requested number of messages were sent, the application
@ -165,6 +166,13 @@ is capped to
.\" For error handling an application using sendmmsg needs to retry at
.\" the first unsent message, so capping is simpler and requires less
.\" application logic than returning EINVAL.
.SH BUGS
If an error occurs after at least one message has been sent,
the call succeeds, and returns the number of messages sent.
The error code is lost. The caller can retry the transmission,
starting at first failed message, but there is no guarantee that,
if an error is returned, it will be the same as the one that was lost
on the previous call.
.SH EXAMPLE
The example below uses
.BR sendmmsg ()