Commit 46d26a0e authored by Steve Holme's avatar Steve Holme
Browse files

smtp: Tidy up to move the eob counter to the per-request structure

Move the eob counter from the smtp_conn structure to the SMTP structure
as it is associated with a SMTP payload on a per-request basis.
parent f4e3cae8
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -1796,8 +1796,8 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
  */
  ssize_t i;
  ssize_t si;
  struct smtp_conn *smtpc = &conn->proto.smtpc;
  struct SessionHandle *data = conn->data;
  struct SMTP *smtp = data->state.proto.smtp;

  /* Do we need to allocate the scatch buffer? */
  if(!data->state.scratch) {
@@ -1812,36 +1812,36 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
  /* This loop can be improved by some kind of Boyer-Moore style of
     approach but that is saved for later... */
  for(i = 0, si = 0; i < nread; i++) {
    if(SMTP_EOB[smtpc->eob] == data->req.upload_fromhere[i])
      smtpc->eob++;
    else if(smtpc->eob) {
    if(SMTP_EOB[smtp->eob] == data->req.upload_fromhere[i])
      smtp->eob++;
    else if(smtp->eob) {
      /* A previous substring matched so output that first */
      memcpy(&data->state.scratch[si], SMTP_EOB, smtpc->eob);
      si += smtpc->eob;
      memcpy(&data->state.scratch[si], SMTP_EOB, smtp->eob);
      si += smtp->eob;

      /* Then compare the first byte */
      if(SMTP_EOB[0] == data->req.upload_fromhere[i])
        smtpc->eob = 1;
        smtp->eob = 1;
      else
        smtpc->eob = 0;
        smtp->eob = 0;
    }

    /* Do we have a match for CRLF. as per RFC-2821, sect. 4.5.2 */
    if(SMTP_EOB_FIND_LEN == smtpc->eob) {
    if(SMTP_EOB_FIND_LEN == smtp->eob) {
      /* Copy the replacement data to the target buffer */
      memcpy(&data->state.scratch[si], SMTP_EOB_REPL, SMTP_EOB_REPL_LEN);
      si += SMTP_EOB_REPL_LEN;
      smtpc->eob = 0;
      smtp->eob = 0;
    }
    else if(!smtpc->eob)
    else if(!smtp->eob)
      data->state.scratch[si++] = data->req.upload_fromhere[i];
  }

  if(smtpc->eob) {
  if(smtp->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;
    memcpy(&data->state.scratch[si], SMTP_EOB, smtp->eob);
    si += smtp->eob;
    smtp->eob = 0;
  }

  if(si != nread) {
+2 −2
Original line number Diff line number Diff line
@@ -60,6 +60,8 @@ typedef enum {
struct SMTP {
  curl_pp_transfer transfer;
  struct curl_slist *rcpt; /* Recipient list */
  size_t eob;              /* Number of bytes of the EOB (End Of Body) that
                              have been received so far */
};

/* smtp_conn is used for struct connection-oriented data in the connectdata
@@ -69,8 +71,6 @@ struct smtp_conn {
  smtpstate state;         /* Always use smtp.c:state() to change state! */
  bool ssldone;            /* Is connect() over SSL done? */
  char *domain;            /* Client address/name to send in the EHLO */
  size_t eob;              /* Number of bytes of the EOB (End Of Body) that
                              have been received so far */
  unsigned int authmechs;  /* Accepted authentication mechanisms */
  unsigned int prefmech;   /* Preferred authentication mechanism */
  unsigned int authused;   /* Auth mechanism used for the connection */