Fix keyword argument separation issues in OpenSSL::SSL::SSLSocket#sys{read,write}_nonblock

It's unlikely anyone would actually hit these.  The methods are
private, you only hit this code path if calling these methods
before performing the SSL connection, and there is already a
verbose warning issued.
This commit is contained in:
Jeremy Evans 2019-09-25 15:03:09 -07:00
Родитель 760893d2f8
Коммит 3959469f24
2 изменённых файлов: 28 добавлений и 4 удалений

Просмотреть файл

@ -1881,8 +1881,13 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
ID meth = nonblock ? rb_intern("read_nonblock") : rb_intern("sysread");
rb_warning("SSL session is not started yet.");
if (nonblock)
return rb_funcall(io, meth, 3, len, str, opts);
if (nonblock) {
VALUE argv[3];
argv[0] = len;
argv[1] = str;
argv[2] = opts;
return rb_funcallv_kw(io, meth, 3, argv, RB_PASS_KEYWORDS);
}
else
return rb_funcall(io, meth, 2, len, str);
}
@ -1972,8 +1977,12 @@ ossl_ssl_write_internal(VALUE self, VALUE str, VALUE opts)
rb_intern("write_nonblock") : rb_intern("syswrite");
rb_warning("SSL session is not started yet.");
if (nonblock)
return rb_funcall(io, meth, 2, str, opts);
if (nonblock) {
VALUE argv[2];
argv[0] = str;
argv[1] = opts;
return rb_funcallv_kw(io, meth, 2, argv, RB_PASS_KEYWORDS);
}
else
return rb_funcall(io, meth, 1, str);
}

Просмотреть файл

@ -155,6 +155,21 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
}
end
def test_sysread_nonblock_and_syswrite_nonblock_keywords
start_server(ignore_listener_error: true) do |port|
sock = TCPSocket.new("127.0.0.1", port)
ssl = OpenSSL::SSL::SSLSocket.new(sock)
assert_warn ("") do
ssl.send(:syswrite_nonblock, "1", exception: false)
ssl.send(:sysread_nonblock, 1, exception: false) rescue nil
ssl.send(:sysread_nonblock, 1, String.new, exception: false) rescue nil
end
ensure
sock&.close
end
end
def test_sync_close
start_server { |port|
begin