CORRECT PATCH Re: sync_client bails when encountering a deleted message

John Capo jc at irbs.com
Tue May 15 20:54:17 EDT 2007


Quoting John Capo (jc at irbs.com):
> Quoting Ken Murchison (murch at andrew.cmu.edu):
> > I don't think I was clear.  With my proposal, we're well past "UPDATE".  I'm talking about cutting the command short after "(<flags>)".  No header_size or anything after.
> 
> I guess I don't understand what you mean.
> 
> It sure looks to me like cmd_upload() has to detect that the header
> size it is waiting for will not arrive and recover gracefully rather
> than sending a BAD that the client sees as the response for its
> next command.  Patch attached.

The server needs to push the character back except on EOF, grrrr.

John Capo


-------------- next part --------------
--- cyrus-imapd-2.3.7/imap/sync_server.c	Sun May 13 11:56:58 2007
+++ cyrus-imapd-2.3.7-abort-upload/imap/sync_server.c	Tue May 15 20:05:57 2007
@@ -1870,13 +1870,27 @@
                 goto parse_err;
             }
 
-            message = sync_message_add(message_list, &item->uuid);
+	    c = prot_getc(sync_in);
+
+	    if (c != EOF)
+		prot_ungetc(c, sync_in);
+
+	    if (c == EOF || !isdigit(c))
+	    {
+		/* Make sure cache data flushed to disk before we commit */
+		sync_message_fsync(message_list);
+		sync_message_list_cache_flush(message_list);
+		sync_upload_list_free(&upload_list);
+		syslog(LOG_ERR, "IOERROR: UPLOAD ABORT");
+		return;
+	    }
 
             /* Parse Message (header size, content lines, cache, message body */
             if ((c = getastring(sync_in, sync_out, &arg)) != ' ') {
                 err = "Invalid Header Size";
                 goto parse_err;
             }
+            message = sync_message_add(message_list, &item->uuid);
             message->hdr_size = sync_atoul(arg.s);
             
             if ((c = getastring(sync_in, sync_out, &arg)) != ' ') {


More information about the Cyrus-devel mailing list