diff options
author | Tanaka Akira <akr@fsij.org> | 2019-07-14 20:46:51 +0900 |
---|---|---|
committer | Tanaka Akira <akr@fsij.org> | 2019-07-14 20:46:51 +0900 |
commit | 4900a10689036211da79c8189ff7eba11c8c81ee (patch) | |
tree | 3b407ee0bb6a994bf4f8e4de743e366b9e26ffde /ext/socket | |
parent | 5bd83909b961546ff6203ad088bfffeb8c19fceb (diff) |
socket: use frozen string buffer when releasing GVL
Thanks for the patch by normalperson (Eric Wong) [Bug #14204].
Diffstat (limited to 'ext/socket')
-rw-r--r-- | ext/socket/ancdata.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c index f5451c9569..69c766e6fd 100644 --- a/ext/socket/ancdata.c +++ b/ext/socket/ancdata.c @@ -1137,6 +1137,7 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags, rb_io_t *fptr; struct msghdr mh; struct iovec iov; + VALUE tmp; int controls_num; #if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) VALUE controls_str = 0; @@ -1151,6 +1152,7 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags, #endif StringValue(data); + tmp = rb_str_tmp_frozen_acquire(data); if (!RB_TYPE_P(controls, T_ARRAY)) { controls = rb_ary_new(); @@ -1261,8 +1263,8 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags, } mh.msg_iovlen = 1; mh.msg_iov = &iov; - iov.iov_base = RSTRING_PTR(data); - iov.iov_len = RSTRING_LEN(data); + iov.iov_base = RSTRING_PTR(tmp); + iov.iov_len = RSTRING_LEN(tmp); #if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) if (controls_str) { mh.msg_control = RSTRING_PTR(controls_str); @@ -1295,6 +1297,7 @@ bsock_sendmsg_internal(VALUE sock, VALUE data, VALUE vflags, #if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL) RB_GC_GUARD(controls_str); #endif + rb_str_tmp_frozen_release(data, tmp); return SSIZET2NUM(ss); } |