diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-02-16 11:44:42 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-02-16 11:44:42 +0000 |
commit | 75a5be3717d15c468beccab2ba618b01f44d56ec (patch) | |
tree | c5a77076f4a1618ae5563f7fd16bd55a8ed5f00f /ext/socket/ancdata.c | |
parent | 1061371f29baabd89c60d2d364947015b928d794 (diff) | |
download | ruby-75a5be3717d15c468beccab2ba618b01f44d56ec.tar.gz |
* ext/socket/ancdata.c (rsock_recvmsg): ignore truncated part of
socket address returned from recvmsg().
* ext/socket/init.c (recvfrom_blocking): ignore truncated part of
socket address returned from recvfrom().
(rsock_s_recvfrom_nonblock): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39278 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/ancdata.c')
-rw-r--r-- | ext/socket/ancdata.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c index fa794eb182..34a6185b9c 100644 --- a/ext/socket/ancdata.c +++ b/ext/socket/ancdata.c @@ -1362,11 +1362,17 @@ struct recvmsg_args_struct { ssize_t rsock_recvmsg(int socket, struct msghdr *message, int flags) { + ssize_t ret; + socklen_t len0; #ifdef MSG_CMSG_CLOEXEC /* MSG_CMSG_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */ flags |= MSG_CMSG_CLOEXEC; #endif - return recvmsg(socket, message, flags); + len0 = message->msg_namelen; + ret = recvmsg(socket, message, flags); + if (ret != -1 && len0 < message->msg_namelen) + message->msg_namelen = len0; + return ret; } static void * |