[前][次][番号順一覧][スレッド一覧]

ruby-changes:11387

From: akr <ko1@a...>
Date: Thu, 19 Mar 2009 23:19:43 +0900 (JST)
Subject: [ruby-changes:11387] Ruby:r23008 (ruby_1_8): * ext/openssl/ossl_ssl.c: revert incomplete read_nonblock

akr	2009-03-19 23:19:35 +0900 (Thu, 19 Mar 2009)

  New Revision: 23008

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23008

  Log:
    * ext/openssl/ossl_ssl.c: revert incomplete read_nonblock
      implemenatation.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/ext/openssl/ossl_ssl.c
    branches/ruby_1_8/test/openssl/test_ssl.rb

Index: ruby_1_8/ext/openssl/ossl_ssl.c
===================================================================
--- ruby_1_8/ext/openssl/ossl_ssl.c	(revision 23007)
+++ ruby_1_8/ext/openssl/ossl_ssl.c	(revision 23008)
@@ -14,12 +14,6 @@
 #include <rubysig.h>
 #include <rubyio.h>
 
-#if defined(HAVE_FCNTL_H) || defined(_WIN32)
-#include <fcntl.h>
-#elif defined(HAVE_SYS_FCNTL_H)
-#include <sys/fcntl.h>
-#endif
-
 #if defined(HAVE_UNISTD_H)
 #  include <unistd.h> /* for read(), and write() */
 #endif
@@ -1105,71 +1099,6 @@
 static VALUE
 ossl_ssl_read(int argc, VALUE *argv, VALUE self)
 {
-  SSL *ssl;
-  int ilen, nread = 0;
-  VALUE len, str;
-  rb_io_t *fptr;
-
-  rb_scan_args(argc, argv, "11", &len, &str);
-  ilen = NUM2INT(len);
-  if(NIL_P(str)) str = rb_str_new(0, ilen);
-  else{
-    StringValue(str);
-    rb_str_modify(str);
-    rb_str_resize(str, ilen);
-  }
-  if(ilen == 0) return str;
-
-  Data_Get_Struct(self, SSL, ssl);
-  GetOpenFile(ossl_ssl_get_io(self), fptr);
-  if (ssl) {
-    if(SSL_pending(ssl) <= 0)
-      rb_thread_wait_fd(FPTR_TO_FD(fptr));
-    for (;;){
-      nread = SSL_read(ssl, RSTRING_PTR(str), RSTRING_LEN(str));
-      switch(ssl_get_error(ssl, nread)){
-        case SSL_ERROR_NONE:
-          goto end;
-        case SSL_ERROR_ZERO_RETURN:
-          rb_eof_error();
-        case SSL_ERROR_WANT_WRITE:
-          rb_io_wait_writable(FPTR_TO_FD(fptr));
-          continue;
-        case SSL_ERROR_WANT_READ:
-          rb_io_wait_readable(FPTR_TO_FD(fptr));
-          continue;
-        case SSL_ERROR_SYSCALL:
-          if(ERR_peek_error() == 0 && nread == 0) rb_eof_error();
-          rb_sys_fail(0);
-        default:
-          ossl_raise(eSSLError, "SSL_read:");
-      }
-    }
-  }
-  else {
-    rb_warning("SSL session is not started yet.");
-    return rb_funcall(ossl_ssl_get_io(self), rb_intern("read_nonblock"), 2, len, str);
-  }
-
-end:
-  rb_str_set_len(str, nread);
-  OBJ_TAINT(str);
-
-  return str;
-}
-
-/*
- * call-seq:
- *    ssl.read_nonblock(length) => string
- *    ssl.read_nonblock(length, buffer) => buffer
- *
- * === Parameters
- * * +length+ is a positive integer.
- * * +buffer+ is a string used to store the result.
- */
-static VALUE
-ossl_ssl_read_nonblock(int argc, VALUE *argv, VALUE self)
-{
     SSL *ssl;
     int ilen, nread = 0;
     VALUE len, str;
@@ -1187,11 +1116,12 @@
 
     Data_Get_Struct(self, SSL, ssl);
     GetOpenFile(ossl_ssl_get_io(self), fptr);
-    rb_io_set_nonblock(fptr);
     if (ssl) {
+	if(SSL_pending(ssl) <= 0)
+	    rb_thread_wait_fd(FPTR_TO_FD(fptr));
 	for (;;){
 	    nread = SSL_read(ssl, RSTRING_PTR(str), RSTRING_LEN(str));
-	    switch(SSL_get_error(ssl, nread)){
+	    switch(ssl_get_error(ssl, nread)){
 	    case SSL_ERROR_NONE:
 		goto end;
 	    case SSL_ERROR_ZERO_RETURN:
@@ -1200,7 +1130,7 @@
                 rb_io_wait_writable(FPTR_TO_FD(fptr));
                 continue;
 	    case SSL_ERROR_WANT_READ:
-	        rb_sys_fail(fptr->path);
+                rb_io_wait_readable(FPTR_TO_FD(fptr));
 		continue;
 	    case SSL_ERROR_SYSCALL:
 		if(ERR_peek_error() == 0 && nread == 0) rb_eof_error();
@@ -1211,8 +1141,9 @@
         }
     }
     else {
+        ID id_sysread = rb_intern("sysread");
         rb_warning("SSL session is not started yet.");
-        return rb_funcall(ossl_ssl_get_io(self), rb_intern("sysread"), 2, len, str);
+        return rb_funcall(ossl_ssl_get_io(self), id_sysread, 2, len, str);
     }
 
   end:
@@ -1586,7 +1517,6 @@
     rb_define_method(cSSLSocket, "sysread",    ossl_ssl_read, -1);
     rb_define_method(cSSLSocket, "syswrite",   ossl_ssl_write, 1);
     rb_define_method(cSSLSocket, "sysclose",   ossl_ssl_close, 0);
-    rb_define_method(cSSLSocket, "read_nonblock",    ossl_ssl_read_nonblock, -1);
     rb_define_method(cSSLSocket, "cert",       ossl_ssl_get_cert, 0);
     rb_define_method(cSSLSocket, "peer_cert",  ossl_ssl_get_peer_cert, 0);
     rb_define_method(cSSLSocket, "peer_cert_chain", ossl_ssl_get_peer_cert_chain, 0);
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 23007)
+++ ruby_1_8/ChangeLog	(revision 23008)
@@ -1,3 +1,8 @@
+Thu Mar 19 23:18:44 2009  Tanaka Akira  <akr@f...>
+
+	* ext/openssl/ossl_ssl.c: revert incomplete read_nonblock
+	  implemenatation.
+
 Wed Mar 18 02:30:41 2009  Masatoshi SEKI  <m_seki@m...>
 
 	* lib/drb/drb.rb (open_server_inaddr_any): fixed multiple network
Index: ruby_1_8/test/openssl/test_ssl.rb
===================================================================
--- ruby_1_8/test/openssl/test_ssl.rb	(revision 23007)
+++ ruby_1_8/test/openssl/test_ssl.rb	(revision 23008)
@@ -155,21 +155,6 @@
     assert_equal(ctx.setup, nil)
   end
 
-  def test_ssl_read_nonblock
-    start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true) { |server, port|
-      sock = TCPSocket.new("127.0.0.1", port)
-      ssl = OpenSSL::SSL::SSLSocket.new(sock)
-      ssl.sync_close = true
-      ssl.connect
-      assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { ssl.read_nonblock(100) }
-      ssl.write("abc\n")
-      IO.select [ssl]
-      assert_equal('a', ssl.read_nonblock(1))
-      assert_equal("bc\n", ssl.read_nonblock(100))
-      assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { ssl.read_nonblock(100) }
-    }
-  end
-
   def test_connect_and_close
     start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|server, port|
       sock = TCPSocket.new("127.0.0.1", port)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]