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 | |
parent | 5bd83909b961546ff6203ad088bfffeb8c19fceb (diff) |
socket: use frozen string buffer when releasing GVL
Thanks for the patch by normalperson (Eric Wong) [Bug #14204].
-rw-r--r-- | ext/socket/ancdata.c | 7 | ||||
-rw-r--r-- | internal.h | 4 |
2 files changed, 7 insertions, 4 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); } diff --git a/internal.h b/internal.h index 4f9c5b1475..0539d49f5b 100644 --- a/internal.h +++ b/internal.h @@ -2080,8 +2080,6 @@ VALUE rb_id_quote_unprintable(ID); char *rb_str_fill_terminator(VALUE str, const int termlen); void rb_str_change_terminator_length(VALUE str, const int oldtermlen, const int termlen); VALUE rb_str_locktmp_ensure(VALUE str, VALUE (*func)(VALUE), VALUE arg); -VALUE rb_str_tmp_frozen_acquire(VALUE str); -void rb_str_tmp_frozen_release(VALUE str, VALUE tmp); VALUE rb_str_chomp_string(VALUE str, VALUE chomp); #ifdef RUBY_ENCODING_H VALUE rb_external_str_with_enc(VALUE str, rb_encoding *eenc); @@ -2376,6 +2374,8 @@ VALUE rb_gcd_gmp(VALUE x, VALUE y); int rb_grantpt(int fd); /* string.c (export) */ +VALUE rb_str_tmp_frozen_acquire(VALUE str); +void rb_str_tmp_frozen_release(VALUE str, VALUE tmp); #ifdef RUBY_ENCODING_H /* internal use */ VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb_encoding *enc); |