diff --git a/lib/modules/SSL.pmod/sslfile.pike b/lib/modules/SSL.pmod/sslfile.pike index 2e82a1ed9fa3f6af75fbc94a2d793b59eabc8c8f..ced3fd2a750870b11104999c4be526fa1e985055 100644 --- a/lib/modules/SSL.pmod/sslfile.pike +++ b/lib/modules/SSL.pmod/sslfile.pike @@ -2066,14 +2066,13 @@ protected int ssl_write_callback (int called_from_real_backend) write_to_stream: do { if (sizeof (write_buffer)) { - string output = write_buffer[0]; int written; #ifdef SIMULATE_CLOSE_PACKET_WRITE_FAILURE if (conn->state & CONNECTION_local_closing) written = -1; else #endif - written = stream->write (output); + written = stream->write (write_buffer); if (written < 0 #if 0 @@ -2148,10 +2147,16 @@ protected int ssl_write_callback (int called_from_real_backend) break write_to_stream; } - if (written == sizeof (output)) - write_buffer = write_buffer[1..]; - else - write_buffer[0] = output[written..]; + for (int bytes = written; bytes > 0;) { + if (bytes >= sizeof(write_buffer[0])) { + bytes -= sizeof(write_buffer[0]); + write_buffer = write_buffer[1..]; + } else { + write_buffer[0] = write_buffer[0][bytes..]; + bytes = 0; + break; + } + } SSL3_DEBUG_MSG ("ssl_write_callback: Wrote %d bytes (%d strings left)\n", written, sizeof (write_buffer)); diff --git a/lib/modules/SSL.pmod/testsuite.in b/lib/modules/SSL.pmod/testsuite.in index b7370b97bacf9548282967e9a124c29b97913756..95e8d342498c7ece436bfc5e0d80cee74ede20b1 100644 --- a/lib/modules/SSL.pmod/testsuite.in +++ b/lib/modules/SSL.pmod/testsuite.in @@ -447,7 +447,7 @@ test_do([[ int state; - int trigged = 20; + int trigged = 10; string fail;