summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanaka Akira <akr@fsij.org>2019-07-14 20:46:51 +0900
committerTanaka Akira <akr@fsij.org>2019-07-14 20:46:51 +0900
commit4900a10689036211da79c8189ff7eba11c8c81ee (patch)
tree3b407ee0bb6a994bf4f8e4de743e366b9e26ffde
parent5bd83909b961546ff6203ad088bfffeb8c19fceb (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.c7
-rw-r--r--internal.h4
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);