diff --git a/lib/modules/SSL.pmod/File.pike b/lib/modules/SSL.pmod/File.pike index a2dfb1176dcf82910a7593cffd21cebe630c7752..45d78f8f4ed889dea27ee4b612d31bc3e3f14876 100644 --- a/lib/modules/SSL.pmod/File.pike +++ b/lib/modules/SSL.pmod/File.pike @@ -93,6 +93,11 @@ protected Stdio.read_callback_t read_callback; protected Stdio.write_callback_t write_callback; protected function(void|mixed:int) close_callback; +// callbacks set during handshake are temporarily deferred and stored here. +protected Stdio.read_callback_t d_read_callback; +protected Stdio.write_callback_t d_write_callback; +protected function(void|mixed:int) d_close_callback; + protected Pike.Backend real_backend; // The real backend for the stream. @@ -1414,14 +1419,21 @@ void set_nonblocking(void|Stdio.read_callback_t read, nonblocking_mode = 1; accept_callback = accept; - read_callback = read; - write_callback = write; - close_callback = close; + + if(SSL_HANDSHAKING) { + d_read_callback = read; + d_write_callback = write; + d_close_callback = close; + } else { + read_callback = read; + write_callback = write; + close_callback = close; + } if (stream) { stream->set_backend(real_backend); - schedule_poll(); + schedule_poll(); // Has to restore here since a backend waiting in another thread // might be woken immediately when callbacks are registered. @@ -1495,7 +1507,8 @@ void set_blocking() nonblocking_mode = 0; accept_callback = read_callback = write_callback = close_callback = 0; - + d_read_callback = d_write_callback = d_close_callback = 0; + if (!local_backend) local_backend = Pike.SmallBackend(); if (stream) { @@ -2014,7 +2027,12 @@ protected int ssl_read_callback (int ignored, string input) if (stringp (data)) { if (!handshake_already_finished && !(conn->state & CONNECTION_handshaking)) { - SSL3_DEBUG_MSG ("ssl_read_callback: Handshake finished\n"); + SSL3_DEBUG_MSG ("ssl_read_callback: Handshake finished\n"); + // set deferred callbacks set during handshake + if(d_read_callback) read_callback = d_read_callback; + if(d_write_callback) write_callback = d_write_callback; + if(d_close_callback) close_callback = d_close_callback; + d_read_callback = d_write_callback = d_close_callback = 0; } SSL3_DEBUG_MSG ("ssl_read_callback: "