From 419f6404d46d8f5e404988149a0881d015113bb9 Mon Sep 17 00:00:00 2001 From: hunterinvariants <217359725+hunterinvariants@users.noreply.github.com> Date: Tue, 11 Aug 2026 06:43:06 +0200 Subject: [PATCH] schannel: reuse the send buffer - Reuse a buffer for schannel_send instead of allocating and freeing a buffer for every send. Closes https://github.com/curl/curl/pull/22540 --- lib/vtls/schannel.c | 19 +++++++++++++------ lib/vtls/schannel_int.h | 2 ++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/vtls/schannel.c b/lib/vtls/schannel.c index 88d7ccec88..aca109bfdc 100644 --- a/lib/vtls/schannel.c +++ b/lib/vtls/schannel.c @@ -1996,13 +1996,18 @@ static CURLcode schannel_send(struct Curl_cfilter *cf, struct Curl_easy *data, len = backend->stream_sizes.cbMaximumMessage; } - /* calculate the complete message length and allocate a buffer for it */ + /* calculate the complete message length and prepare the send buffer */ data_len = backend->stream_sizes.cbHeader + len + backend->stream_sizes.cbTrailer; - ptr = curlx_malloc(data_len); - if(!ptr) { - return CURLE_OUT_OF_MEMORY; + if(data_len > backend->send_buffer_len) { + ptr = curlx_realloc(backend->send_buffer, data_len); + if(!ptr) + return CURLE_OUT_OF_MEMORY; + backend->send_buffer = ptr; + backend->send_buffer_len = data_len; } + else + ptr = backend->send_buffer; /* setup output buffers (header, data, trailer, empty) */ InitSecBuffer(&outbuf[0], SECBUFFER_STREAM_HEADER, @@ -2091,8 +2096,6 @@ static CURLcode schannel_send(struct Curl_cfilter *cf, struct Curl_easy *data, result = CURLE_SEND_ERROR; } - curlx_safefree(ptr); - if(len == *pnwritten) /* Encrypted message including header, data and trailer entirely sent. The return value is the number of unencrypted bytes that were sent. */ @@ -2567,6 +2570,10 @@ static void schannel_close(struct Curl_cfilter *cf, struct Curl_easy *data) backend->cred = NULL; } + /* free the buffer used to encrypt outgoing data */ + curlx_safefree(backend->send_buffer); + backend->send_buffer_len = 0; + /* free internal buffer for received encrypted data */ if(backend->encdata.buffer) { curlx_safefree(backend->encdata.buffer); diff --git a/lib/vtls/schannel_int.h b/lib/vtls/schannel_int.h index 242f6a0f44..ccbb63d7e2 100644 --- a/lib/vtls/schannel_int.h +++ b/lib/vtls/schannel_int.h @@ -112,6 +112,8 @@ struct sbuffer { }; struct schannel_ssl_backend_data { + unsigned char *send_buffer; + size_t send_buffer_len; struct sbuffer encdata; struct sbuffer decdata; struct Curl_schannel_cred *cred;