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;