]> granicus.if.org Git - curl/commitdiff
POP3: detect when LIST returns no mails
authorDaniel Stenberg <daniel@haxx.se>
Tue, 29 Nov 2011 12:43:46 +0000 (13:43 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 29 Nov 2011 12:43:46 +0000 (13:43 +0100)
By making sure the function can detect an "end of body" sequence
immediately on the first line, test 811 is now enabled.

lib/pop3.c
lib/pop3.h
tests/data/DISABLED

index a47717a71f35e63b69b566f8d26b3d22fb59676c..5d06dfcb534e86e5c7678e9bc5b51df8540e729b 100644 (file)
@@ -421,6 +421,16 @@ static CURLcode pop3_state_list_resp(struct connectdata *conn,
     return CURLE_RECV_ERROR;
   }
 
+  /* This 'OK' line ends with a CR LF pair which is the two first bytes of the
+     EOB string so count this is two matching bytes. This is necessary to make
+     the code detect the EOB if the only data than comes now is %2e CR LF like
+     when there is no body to return. */
+  pop3c->eob = 2;
+
+  /* But since this initial CR LF pair is not part of the actual body, we set
+     the strip counter here so that these bytes won't be delivered. */
+  pop3c->strip = 2;
+
   /* POP3 download */
   Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, pop3->bytecountp,
                       -1, NULL); /* no upload here */
@@ -1082,11 +1092,22 @@ CURLcode Curl_pop3_write(struct connectdata *conn,
       return CURLE_OK;
     }
     else if(prev && (prev >= pop3c->eob)) {
-      /* write out the body part that didn't match */
-      result = Curl_client_write(conn, CLIENTWRITE_BODY, (char*)POP3_EOB,
-                                 prev);
-      if(result)
-        return result;
+
+      /* strip can only be non-zero for the very first mismatch after CRLF and
+         then both prev and strip are equal and nothing will be output
+         below */
+      while(prev && pop3c->strip) {
+        prev--;
+        pop3c->strip--;
+      }
+
+      if(prev) {
+        /* write out the body part that didn't match */
+        result = Curl_client_write(conn, CLIENTWRITE_BODY, (char*)POP3_EOB,
+                                   prev);
+        if(result)
+          return result;
+      }
     }
   }
 
@@ -1094,7 +1115,15 @@ CURLcode Curl_pop3_write(struct connectdata *conn,
     /* while EOB is matching, don't output it! */
     return CURLE_OK;
 
-  result = Curl_client_write(conn, CLIENTWRITE_BODY, str, nread);
+  while(nread && pop3c->strip) {
+    nread--;
+    pop3c->strip--;
+    str++;
+  }
+
+  if(nread) {
+    result = Curl_client_write(conn, CLIENTWRITE_BODY, str, nread);
+  }
 
   return result;
 }
index 15256738ea7bb544f32e3c4502f8ea102f66752d..e9bbd91953fd0c414c13fb0327b1037922a4abc2 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -46,6 +46,7 @@ struct pop3_conn {
   char *mailbox;     /* what to RETR */
   size_t eob;        /* number of bytes of the EOB (End Of Body) that has been
                         received thus far */
+  size_t strip;      /* number of bytes from the start to ignore as non-body */
   pop3state state; /* always use pop3.c:state() to change state! */
 };
 
index 085a3a38767f339a1d9ce9bc2386870ec6b8283e..72c3909bd65b28a018fd63451612a8e597f078a7 100644 (file)
@@ -2,7 +2,6 @@
 # test cases are run by runtests.pl. Just add the plain test case numbers, one
 # per line.
 # Lines starting with '#' letters are treated as comments.
-811
 815
 591
 592