diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-19 13:49:58 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-19 13:49:58 +0000 |
commit | 33b832979b2d01a865a25c9faefe6a3cee6e5dc2 (patch) | |
tree | 14b48449bb199cafd62a20a89e52d4afdf8ecfed /ext/socket | |
parent | 121b6e064a1b167dddbdc271d503ff96e7deb83b (diff) | |
download | ruby-33b832979b2d01a865a25c9faefe6a3cee6e5dc2.tar.gz |
* ext/socket/ancdata.c: Check buffer full and ignore MSG_TRUNC flag.
buffer fullness is more robust to detect the message is too big for
the buffer.
AIX 7.1 recvmsg doesn't set MSG_TRUNC for rflags when MSG_PEEK is
given.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52673 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket')
-rw-r--r-- | ext/socket/ancdata.c | 11 | ||||
-rw-r--r-- | ext/socket/lib/socket.rb | 3 |
2 files changed, 4 insertions, 10 deletions
diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c index 93615f2766..c54df04038 100644 --- a/ext/socket/ancdata.c +++ b/ext/socket/ancdata.c @@ -1580,13 +1580,13 @@ bsock_recvmsg_internal(VALUE sock, if (grow_buffer) { int grown = 0; -#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) - if (NIL_P(vmaxdatlen) && (mh.msg_flags & MSG_TRUNC)) { + if (NIL_P(vmaxdatlen) && ss != -1 && ss == (ssize_t)iov.iov_len) { if (SIZE_MAX/2 < maxdatlen) rb_raise(rb_eArgError, "max data length too big"); maxdatlen *= 2; grown = 1; } +#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) if (NIL_P(vmaxctllen) && (mh.msg_flags & MSG_CTRUNC)) { #define BIG_ENOUGH_SPACE 65536 if (BIG_ENOUGH_SPACE < maxctllen && @@ -1606,13 +1606,6 @@ bsock_recvmsg_internal(VALUE sock, } #undef BIG_ENOUGH_SPACE } -#else - if (NIL_P(vmaxdatlen) && ss != -1 && ss == (ssize_t)iov.iov_len) { - if (SIZE_MAX/2 < maxdatlen) - rb_raise(rb_eArgError, "max data length too big"); - maxdatlen *= 2; - grown = 1; - } #endif if (grown) { rsock_discard_cmsg_resource(&mh, (flags & MSG_PEEK) != 0); diff --git a/ext/socket/lib/socket.rb b/ext/socket/lib/socket.rb index 0240c2094e..31dc596d3e 100644 --- a/ext/socket/lib/socket.rb +++ b/ext/socket/lib/socket.rb @@ -415,7 +415,8 @@ class BasicSocket < IO # # _maxmesglen_ and _maxcontrollen_ can be nil. # In that case, the buffer will be grown until the message is not truncated. - # Internally, MSG_PEEK is used and MSG_TRUNC/MSG_CTRUNC are checked. + # Internally, MSG_PEEK is used. + # Buffer full and MSG_CTRUNC are checked for truncation. # # recvmsg can be used to implement recv_io as follows: # |