If the scratch buffer was allocated in a previous call to
Curl_smtp_escape_eob(), a new buffer not allocated in the subsequent
call and no action taken by that call, then an attempt would be made to
try and free the buffer which, by now, would be part of the data->state
structure.
This bug was introduced in commit
4bd860a001.
struct SessionHandle *data = conn->data;
struct SMTP *smtp = data->req.protop;
char *scratch = data->state.scratch;
+ char *newscratch = NULL;
char *oldscratch = NULL;
size_t eob_sent;
if(!scratch || data->set.crlf) {
oldscratch = scratch;
- scratch = malloc(2 * BUFSIZE);
- if(!scratch) {
+ scratch = newscratch = malloc(2 * BUFSIZE);
+ if(!newscratch) {
failf(data, "Failed to alloc scratch buffer!");
return CURLE_OUT_OF_MEMORY;
data->req.upload_present = si;
}
else
- Curl_safefree(scratch);
+ Curl_safefree(newscratch);
return CURLE_OK;
}