changeset 507:eebb12795ea7 HEAD

Error message fixes for APPEND. Make sure we don't crash if sync_callbacks isn't set. Don't set sync_callbacks until SELECT is finished.
author Timo Sirainen <tss@iki.fi>
date Fri, 25 Oct 2002 04:59:36 +0300
parents 0329dd6cd40e
children d97b0454692e
files src/imap/cmd-select.c src/lib-storage/index/index-save.c src/lib-storage/index/index-sync.c
diffstat 3 files changed, 19 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/cmd-select.c	Fri Oct 25 04:58:43 2002 +0300
+++ b/src/imap/cmd-select.c	Fri Oct 25 04:59:36 2002 +0300
@@ -35,6 +35,8 @@
 		return TRUE;
 	}
 
+	/* set callbacks after STATUS, which might otherwise try calling
+	   some of them */
 	box->set_sync_callbacks(box, &sync_callbacks, client);
 
 	client_send_mailbox_flags(client, box, status.custom_flags,
@@ -63,6 +65,7 @@
 	client_send_tagline(client, box->readonly ?
 			    "OK [READ-ONLY] Select completed." :
 			    "OK [READ-WRITE] Select completed.");
+
 	return TRUE;
 }
 
--- a/src/lib-storage/index/index-save.c	Fri Oct 25 04:58:43 2002 +0300
+++ b/src/lib-storage/index/index-save.c	Fri Oct 25 04:59:36 2002 +0300
@@ -85,8 +85,14 @@
 	while (data_size > 0) {
 		ret = i_buffer_read(inbuf);
 		if (ret < 0) {
-			mail_storage_set_critical(storage,
-						  "Error reading mail: %m");
+			errno = inbuf->buf_errno;
+			if (errno == 0) {
+				mail_storage_set_error(storage,
+					"Client disconnected");
+			} else {
+				mail_storage_set_critical(storage,
+					"Error reading mail from client: %m");
+			}
 			return FALSE;
 		}
 
@@ -97,6 +103,7 @@
 		if (!failed) {
 			ret = write_func(outbuf, data, size);
 			if (ret < 0) {
+				errno = outbuf->buf_errno;
 				if (errno == ENOSPC) {
 					mail_storage_set_error(storage,
 						"Not enough disk space");
--- a/src/lib-storage/index/index-sync.c	Fri Oct 25 04:58:43 2002 +0300
+++ b/src/lib-storage/index/index-sync.c	Fri Oct 25 04:59:36 2002 +0300
@@ -10,6 +10,9 @@
 {
 	unsigned int messages, recent;
 
+	if (ibox->sync_callbacks.new_messages == NULL)
+		return;
+
 	messages = ibox->index->get_header(ibox->index)->messages_count;
 	messages += mail_modifylog_get_expunge_count(ibox->index->modifylog);
 
@@ -39,7 +42,8 @@
 		}
 
 		/* notify client once about it */
-		if (!ibox->sent_diskspace_warning) {
+		if (!ibox->sent_diskspace_warning &&
+		    ibox->sync_callbacks.alert_no_diskspace != NULL) {
 			ibox->sent_diskspace_warning = TRUE;
 			ibox->sync_callbacks.alert_no_diskspace(
 						&ibox->box, ibox->sync_context);
@@ -56,7 +60,8 @@
 		index_storage_sync_size(ibox);
 
 	/* notify changes in custom flags */
-	if (mail_custom_flags_has_changes(index->custom_flags)) {
+	if (mail_custom_flags_has_changes(index->custom_flags) &&
+	    ibox->sync_callbacks.new_custom_flags != NULL) {
 		ibox->sync_callbacks.new_custom_flags(&ibox->box,
                 	mail_custom_flags_list_get(index->custom_flags),
 			MAIL_CUSTOM_FLAGS_COUNT, ibox->sync_context);