diff options
author | tuexen <tuexen@FreeBSD.org> | 2010-08-07 17:57:58 +0000 |
---|---|---|
committer | tuexen <tuexen@FreeBSD.org> | 2010-08-07 17:57:58 +0000 |
commit | 542f657a7fdb80cdc9f13a9dd26ca473a3ea4920 (patch) | |
tree | 0265147670401264345ccae3a5d18f2a60ecc68a /sys/kern | |
parent | 6962657fcaae7a5fd9cb2ae10ca1e40f533d0608 (diff) | |
download | FreeBSD-src-542f657a7fdb80cdc9f13a9dd26ca473a3ea4920.zip FreeBSD-src-542f657a7fdb80cdc9f13a9dd26ca473a3ea4920.tar.gz |
Fix a bug where MSG_TRUNC was not returned in all necessary cases for
SOCK_DGRAM socket. MSG_TRUNC was only returned when some mbufs could
not be copied to the application. If some data was left in the last
mbuf, it was correctly discarded, but MSG_TRUNC was not set.
Reviewed by: bz
MFC after: 3 weeks
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/uipc_socket.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 1734960..d3aa490 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -2236,7 +2236,12 @@ soreceive_dgram(struct socket *so, struct sockaddr **psa, struct uio *uio, m_freem(m); return (error); } - m = m_free(m); + if (len == m->m_len) + m = m_free(m); + else { + m->m_data += len; + m->m_len -= len; + } } if (m != NULL) flags |= MSG_TRUNC; |