From b00bef2f83c63be464e2c9b6a232f97b24262a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Mon, 14 Jul 2014 17:07:12 +0200 Subject: [PATCH] SSL.File: More clean-ups in write(). Reduces the code complexity in write() a bit further. --- lib/modules/SSL.pmod/File.pike | 73 ++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/lib/modules/SSL.pmod/File.pike b/lib/modules/SSL.pmod/File.pike index 53e21ef4bd..023e107db2 100644 --- a/lib/modules/SSL.pmod/File.pike +++ b/lib/modules/SSL.pmod/File.pike @@ -966,49 +966,52 @@ int write (string|array(string) data, mixed... args) // Take care of any old data first. if (!direct_write()) RETURN (-1); + int write_limit = 0x7fffffff; + if (nonblocking_mode) { + // Always stop after writing DATA_CHUNK_SIZE in + // nonblocking mode, so that we don't loop here + // arbitrarily long if the write is very large and the + // bottleneck is in the encryption. + write_limit = Stdio.DATA_CHUNK_SIZE; + } + int written = 0; int idx = 0, pos = 0; - while (idx < sizeof (data) && !sizeof (write_buffer) && - // Always stop after writing DATA_CHUNK_SIZE in - // nonblocking mode, so that we don't loop here - // arbitrarily long if the write is very large and the - // bottleneck is in the encryption. - (!nonblocking_mode || written < Stdio.DATA_CHUNK_SIZE)) { - int size = sizeof (data[idx]) - pos; - if (size > fragment_max_size) { - // send_streaming_data will pick the first fragment_max_size - // bytes of the string, so do that right away in the same - // range operation. - int n = conn->send_streaming_data ( - data[idx][pos..pos + fragment_max_size - 1]); - SSL3_DEBUG_MSG ("SSL.File->write: Queued data[%d][%d..%d]\n", - idx, pos, pos + n - 1); - written += n; - pos += n; - } + written < write_limit) { +#ifdef SSL3_DEBUG + int oidx = idx; + int opos = pos; +#endif - else { - // Try to fill a packet. - int end; - for (end = idx + 1; end < sizeof (data); end++) { - int newsize = size + sizeof (data[end]); - if (newsize > fragment_max_size) break; - size = newsize; - } + // send_streaming_data will pick the first fragment_max_size + // bytes of the string, so do that right away in the same + // range operation. + string frag = data[idx][pos..pos + fragment_max_size -1]; + pos += fragment_max_size; - if (conn->send_streaming_data ( - `+ (data[idx][pos..], @data[idx+1..end-1])) < size) - error ("Unexpected fragment_max_size discrepancy wrt send_streaming_data.\n"); + while (sizeof(frag) < fragment_max_size) { + // Try to fill a packet. + if (++idx >= sizeof(data)) break; + pos = fragment_max_size - sizeof(frag); + frag += data[idx][..pos -1]; + } - SSL3_DEBUG_MSG ("SSL.File->write: " - "Queued data[%d][%d..%d] + data[%d..%d]\n", - idx, pos, sizeof (data[idx]) - 1, idx + 1, end - 1); - written += size; - idx = end; - pos = 0; + int n = conn->send_streaming_data (frag); + if (n != sizeof(frag)) { + error ("Unexpected fragment_max_size discrepancy wrt send_streaming_data.\n"); } +#ifdef SSL3_DEBUG + if (oidx == idx) { + SSL3_DEBUG_MSG("SSL.File->write: Queued data[%d][%d..%d]\n", + idx, opos, pos - 1); + } else { + SSL3_DEBUG_MSG("SSL.File->write: Queued data[%d..%d][%d..%d]\n", + oidx, idx, opos, pos - 1); + } +#endif + written += n; if (!direct_write()) RETURN (written); } -- GitLab