mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/openssl] ssl: create a temporary frozen string buffer when writing
Since a blocking SSLSocket#syswrite call allows context switches while
waiting for the underlying socket to be ready, we must freeze the string
buffer to prevent other threads from modifying it.
Reference: https://github.com/ruby/openssl/issues/452
aea874bc6e
This commit is contained in:
parent
ed7ea35d74
commit
5828807626
1 changed files with 5 additions and 5 deletions
|
@ -1912,21 +1912,21 @@ ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
|
||||||
int nwrite = 0;
|
int nwrite = 0;
|
||||||
rb_io_t *fptr;
|
rb_io_t *fptr;
|
||||||
int nonblock = opts != Qfalse;
|
int nonblock = opts != Qfalse;
|
||||||
VALUE io;
|
VALUE tmp, io;
|
||||||
|
|
||||||
StringValue(str);
|
tmp = rb_str_new_frozen(StringValue(str));
|
||||||
GetSSL(self, ssl);
|
GetSSL(self, ssl);
|
||||||
io = rb_attr_get(self, id_i_io);
|
io = rb_attr_get(self, id_i_io);
|
||||||
GetOpenFile(io, fptr);
|
GetOpenFile(io, fptr);
|
||||||
if (ssl_started(ssl)) {
|
if (ssl_started(ssl)) {
|
||||||
for (;;){
|
for (;;) {
|
||||||
int num = RSTRING_LENINT(str);
|
int num = RSTRING_LENINT(tmp);
|
||||||
|
|
||||||
/* SSL_write(3ssl) manpage states num == 0 is undefined */
|
/* SSL_write(3ssl) manpage states num == 0 is undefined */
|
||||||
if (num == 0)
|
if (num == 0)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
nwrite = SSL_write(ssl, RSTRING_PTR(str), num);
|
nwrite = SSL_write(ssl, RSTRING_PTR(tmp), num);
|
||||||
switch(ssl_get_error(ssl, nwrite)){
|
switch(ssl_get_error(ssl, nwrite)){
|
||||||
case SSL_ERROR_NONE:
|
case SSL_ERROR_NONE:
|
||||||
goto end;
|
goto end;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue