[dovecot-cvs] dovecot/src/lib-storage/index/mbox mbox-save.c, 1.94.2.10, 1.94.2.11

tss at dovecot.org tss at dovecot.org
Sun Mar 11 18:27:54 EET 2007


Update of /var/lib/cvs/dovecot/src/lib-storage/index/mbox
In directory talvi:/tmp/cvs-serv5284

Modified Files:
      Tag: branch_1_0
	mbox-save.c 
Log Message:
o_stream_seek() may do buffer flushing internally and cause errors. Do
flushing manually before seeking so that we don't confuse the errors. Also did
some code cleanups.



Index: mbox-save.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/mbox/mbox-save.c,v
retrieving revision 1.94.2.10
retrieving revision 1.94.2.11
diff -u -d -r1.94.2.10 -r1.94.2.11
--- mbox-save.c	10 Mar 2007 20:58:45 -0000	1.94.2.10
+++ mbox-save.c	11 Mar 2007 16:27:52 -0000	1.94.2.11
@@ -56,17 +56,17 @@
 
 static char my_hostdomain[256] = "";
 
-static void write_error(struct mbox_save_context *ctx, int error)
+static int write_error(struct mbox_save_context *ctx)
 {
-	if (ENOSPACE(error)) {
+	if (ENOSPACE(errno)) {
 		mail_storage_set_error(STORAGE(ctx->mbox->storage),
 				       "Not enough disk space");
 	} else {
-		errno = error;
 		mbox_set_syscall_error(ctx->mbox, "write()");
 	}
 
 	ctx->failed = TRUE;
+	return -1;
 }
 
 static int mbox_seek_to_end(struct mbox_save_context *ctx, uoff_t *offset)
@@ -95,10 +95,8 @@
 		return mbox_set_syscall_error(ctx->mbox, "read()");
 
 	if (ch != '\n') {
-		if (write_full(fd, "\n", 1) < 0) {
-			write_error(ctx, errno);
-			return -1;
-		}
+		if (write_full(fd, "\n", 1) < 0)
+			return write_error(ctx);
 		*offset += 1;
 	}
 
@@ -107,10 +105,8 @@
 
 static int mbox_append_lf(struct mbox_save_context *ctx)
 {
-	if (o_stream_send(ctx->output, "\n", 1) < 0) {
-		write_error(ctx, ctx->output->stream_errno);
-		return -1;
-	}
+	if (o_stream_send(ctx->output, "\n", 1) < 0)
+		return write_error(ctx);
 
 	return 0;
 }
@@ -146,7 +142,7 @@
 	line = mbox_from_create(from_envelope, received_date);
 
 	if ((ret = o_stream_send_str(ctx->output, line)) < 0)
-		write_error(ctx, ctx->output->stream_errno);
+		write_error(ctx);
 	t_pop();
 
 	return ret;
@@ -157,7 +153,6 @@
 	uoff_t end_offset;
 	const char *str;
 	size_t len;
-	int ret = 0;
 
 	if (ctx->mbox->mbox_writeonly) {
 		/* we can't seek, don't set Content-Length */
@@ -167,27 +162,25 @@
 	end_offset = ctx->output->offset;
 
 	/* write Content-Length headers */
-	t_push();
 	str = t_strdup_printf("\nContent-Length: %s",
 			      dec2str(end_offset - ctx->eoh_offset));
 	len = strlen(str);
 
+	/* flush manually here so that we don't confuse seek() errors with
+	   buffer flushing errors */
+	if (o_stream_flush(ctx->output) < 0)
+		return write_error(ctx);
 	if (o_stream_seek(ctx->output, ctx->extra_hdr_offset +
-			  ctx->space_end_idx - len) < 0) {
-		mbox_set_syscall_error(ctx->mbox, "o_stream_seek()");
-		ret = -1;
-	} else if (o_stream_send(ctx->output, str, len) < 0) {
-		write_error(ctx, ctx->output->stream_errno);
-		ret = -1;
-	} else {
-		if (o_stream_seek(ctx->output, end_offset) < 0) {
-			mbox_set_syscall_error(ctx->mbox, "o_stream_seek()");
-			ret = -1;
-		}
-	}
+			  ctx->space_end_idx - len) < 0)
+		return mbox_set_syscall_error(ctx->mbox, "o_stream_seek()");
 
-	t_pop();
-	return ret;
+	if (o_stream_send(ctx->output, str, len) < 0 ||
+	    o_stream_flush(ctx->output) < 0)
+		return write_error(ctx);
+
+	if (o_stream_seek(ctx->output, end_offset) < 0)
+		return mbox_set_syscall_error(ctx->mbox, "o_stream_seek()");
+	return 0;
 }
 
 static void mbox_save_init_sync(struct mbox_transaction_context *t)
@@ -509,11 +502,8 @@
 				return 0;
 
 			data = i_stream_get_data(ctx->input, &size);
-			if (o_stream_send(ctx->body_output, data, size) < 0) {
-				write_error(ctx,
-					    ctx->body_output->stream_errno);
-				return -1;
-			}
+			if (o_stream_send(ctx->body_output, data, size) < 0)
+				return write_error(ctx);
 			ctx->last_char = data[size-1];
 			i_stream_skip(ctx->input, size);
 		}
@@ -523,11 +513,8 @@
 			   otherwise some mbox parsers don't like the result.
 			   this makes it impossible to save a mail that doesn't
 			   end with LF though. */
-			if (o_stream_send(ctx->body_output, "\n", 1) < 0) {
-				write_error(ctx,
-					    ctx->body_output->stream_errno);
-				return -1;
-			}
+			if (o_stream_send(ctx->body_output, "\n", 1) < 0)
+				return write_error(ctx);
 		}
 		return 0;
 	}
@@ -541,29 +528,23 @@
 		    ctx->input->v_offset + size >= ctx->eoh_input_offset) {
 			/* found end of headers. write the rest of them. */
 			size = ctx->eoh_input_offset - ctx->input->v_offset;
-			if (o_stream_send(ctx->output, data, size) < 0) {
-				write_error(ctx, ctx->output->stream_errno);
-				return -1;
-			}
+			if (o_stream_send(ctx->output, data, size) < 0)
+				return write_error(ctx);
 			if (size > 0)
 				ctx->last_char = data[size-1];
 			i_stream_skip(ctx->input, size + 1);
 			break;
 		}
 
-		if (o_stream_send(ctx->output, data, size) < 0) {
-			write_error(ctx, ctx->output->stream_errno);
-			return -1;
-		}
+		if (o_stream_send(ctx->output, data, size) < 0)
+			return write_error(ctx);
 		ctx->last_char = data[size-1];
 		i_stream_skip(ctx->input, size);
 	}
 
 	if (ctx->last_char != '\n') {
-		if (o_stream_send(ctx->output, "\n", 1) < 0) {
-			write_error(ctx, ctx->output->stream_errno);
-			return -1;
-		}
+		if (o_stream_send(ctx->output, "\n", 1) < 0)
+			return write_error(ctx);
 	}
 
 	if (ctx->mbox_md5_ctx) {
@@ -578,10 +559,8 @@
 	/* append our own headers and ending empty line */
 	ctx->extra_hdr_offset = ctx->output->offset;
 	if (o_stream_send(ctx->output, str_data(ctx->headers),
-			  str_len(ctx->headers)) < 0) {
-		write_error(ctx, ctx->output->stream_errno);
-		return -1;
-	}
+			  str_len(ctx->headers)) < 0)
+		return write_error(ctx);
 	ctx->eoh_offset = ctx->output->offset;
 
 	/* write body */
@@ -595,9 +574,11 @@
 
 	ctx->finished = TRUE;
 	if (!ctx->failed) {
+		t_push();
 		if (mbox_write_content_length(ctx) < 0 ||
 		    mbox_append_lf(ctx) < 0)
 			ctx->failed = TRUE;
+		t_pop();
 	}
 
 	if (ctx->input != NULL)



More information about the dovecot-cvs mailing list