schannel: reuse the send buffer
No binary (build failed)
—
(log yok)
| @@ -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); | |
| @@ -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; | |