changeset 7170:36092ec27396 HEAD

Extensions weren't copied in memory correctly, possibly causing garbage to be written to uidlist file.
author Timo Sirainen <tss@iki.fi>
date Sat, 19 Jan 2008 09:08:22 +0200
parents b9d78196e9ba
children 2e60288f0d75
files src/lib-storage/index/maildir/maildir-uidlist.c
diffstat 1 files changed, 22 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Sat Jan 19 08:50:56 2008 +0200
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Sat Jan 19 09:08:22 2008 +0200
@@ -1210,6 +1210,27 @@
 	ctx->finished = FALSE;
 }
 
+static char *ext_dup(pool_t pool, const char *extensions)
+{
+	char *ret;
+
+	if (extensions == NULL)
+		return NULL;
+
+	T_FRAME_BEGIN {
+		string_t *str = t_str_new(64);
+		unsigned int len;
+
+		while (*extensions != '\0') {
+			len = strlen(extensions);
+			str_append_n(str, extensions, len);
+			extensions += len + 1;
+		}
+		ret = p_strdup(pool, str_c(str));
+	} T_FRAME_END;
+	return ret;
+}
+
 int maildir_uidlist_sync_next(struct maildir_uidlist_sync_ctx *ctx,
 			      const char *filename,
 			      enum maildir_uidlist_rec_flag flags)
@@ -1247,7 +1268,7 @@
 		if (old_rec != NULL) {
 			*rec = *old_rec;
 			rec->extensions =
-				p_strdup(ctx->record_pool, rec->extensions);
+				ext_dup(ctx->record_pool, rec->extensions);
 		} else {
 			rec->uid = (uint32_t)-1;
 			ctx->new_files_count++;