Commit 25884aa1 authored by Jiri Hruska's avatar Jiri Hruska Committed by Steve Holme
Browse files

imap: Improved FETCH response parsing

Added safer parsing of the untagged FETCH response line and the size of
continuation data.
parent be51a463
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -1252,6 +1252,8 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
  struct imap_conn *imapc = &conn->proto.imapc;
  struct pingpong *pp = &imapc->pp;
  const char *ptr = data->state.buffer;
  bool parsed = FALSE;
  curl_off_t size;

  (void)instate; /* no use for this yet */

@@ -1267,11 +1269,16 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,
    ptr++;

  if(*ptr == '{') {
    curl_off_t size = curlx_strtoofft(ptr + 1, NULL, 10);
    if(size)
      Curl_pgrsSetDownloadSize(data, size);
    char *endptr;
    size = curlx_strtoofft(ptr + 1, &endptr, 10);
    if(endptr - ptr > 1 && endptr[0] == '}' &&
       endptr[1] == '\r' && endptr[2] == '\0')
      parsed = TRUE;
  }

  if(parsed) {
    infof(data, "Found %" FORMAT_OFF_TU " bytes to download\n", size);
    Curl_pgrsSetDownloadSize(data, size);

    if(pp->cache) {
      /* At this point there is a bunch of data in the header "cache" that is
@@ -1316,9 +1323,11 @@ static CURLcode imap_state_fetch_resp(struct connectdata *conn, int imapcode,

    data->req.maxdownload = size;
  }
  else
  else {
    /* We don't know how to parse this line */
    failf(pp->conn->data, "Failed to parse FETCH response.");
    result = CURLE_FTP_WEIRD_SERVER_REPLY; /* TODO: fix this code */
  }

  /* End of DO phase */
  state(conn, IMAP_STOP);