Commit 3d98aed5 authored by Steve Holme's avatar Steve Holme Committed by Daniel Stenberg
Browse files

smtp.c: Fixed an issue with the EOB checking

Curl_smtp_escape_eob() would leave off final CRLFs from emails ending
in multiple blank lines additionally leaving the smtpc->eob variable
with the character count in, which would cause problems for additional
emails when sent through multiple calls to curl_easy_perform() after a
CURLOPT_CONNECT_ONLY.
parent 4cf742f3
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -1679,12 +1679,15 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
  struct smtp_conn *smtpc = &conn->proto.smtpc;
  struct SessionHandle *data = conn->data;

  if(data->state.scratch == NULL)
  /* Do we need to allocate the scatch buffer? */
  if(!data->state.scratch)  {
    data->state.scratch = malloc(2 * BUFSIZE);
  if(data->state.scratch == NULL) {

    if(!data->state.scratch) {
      failf (data, "Failed to alloc scratch buffer!");
      return CURLE_OUT_OF_MEMORY;
    }
  }

  /* This loop can be improved by some kind of Boyer-Moore style of
     approach but that is saved for later... */
@@ -1692,7 +1695,7 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
    if(SMTP_EOB[smtpc->eob] == data->req.upload_fromhere[i])
      smtpc->eob++;
    else if(smtpc->eob) {
      /* previously a substring matched, output that first */
      /* A previous substring matched so output that first */
      memcpy(&data->state.scratch[si], SMTP_EOB, smtpc->eob);
      si += smtpc->eob;

@@ -1718,6 +1721,13 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
      data->state.scratch[si++] = data->req.upload_fromhere[i];
  }

  if(smtpc->eob) {
    /* A substring matched before processing ended so output that now */
    memcpy(&data->state.scratch[si], SMTP_EOB, smtpc->eob);
    si += smtpc->eob;
    smtpc->eob = 0;
  }

  if(si != nread) {
    /* only use the new buffer if we replaced something */
    nread = si;