changeset 19463:183576574417

sdbox: Fixed assert-crash when message with external attachments was copied between storages.
author Timo Sirainen <tss@iki.fi>
date Sun, 06 Dec 2015 14:27:46 +0200
parents 93b0474fe9d6
children 81450c4bfe96
files src/lib-storage/index/dbox-single/sdbox-copy.c
diffstat 1 files changed, 11 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-single/sdbox-copy.c	Fri Dec 04 14:17:45 2015 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-copy.c	Sun Dec 06 14:27:46 2015 +0200
@@ -28,8 +28,12 @@
 	}
 	if (dest_storage->attachment_dir == NULL ||
 	    strcmp(src_storage->attachment_dir,
-		   dest_storage->attachment_dir) != 0) {
-		/* different attachment dirs between storages.
+		   dest_storage->attachment_dir) != 0 ||
+	    strcmp(src_storage->storage.set->mail_attachment_fs,
+		   dest_storage->storage.set->mail_attachment_fs) != 0 ||
+	    strcmp(src_storage->storage.set->mail_attachment_hash,
+		   dest_storage->storage.set->mail_attachment_hash) != 0) {
+		/* different attachment dirs/settings between storages.
 		   have to copy the slow way. */
 		return 0;
 	}
@@ -62,7 +66,11 @@
 					   guid_generate(), NULL);
 		dest = t_strdup_printf("%s/%s", dest_storage->attachment_dir,
 				       dest_relpath);
-		src_fsfile = fs_file_init(src_storage->attachment_fs, src,
+		/* we verified above that attachment_fs is compatible for
+		   src and dest, so it doesn't matter which storage's
+		   attachment_fs we use. in any case we need to use the same
+		   one or fs_copy() will crash with assert. */
+		src_fsfile = fs_file_init(dest_storage->attachment_fs, src,
 					  FS_OPEN_MODE_READONLY);
 		dest_fsfile = fs_file_init(dest_storage->attachment_fs, dest,
 					   FS_OPEN_MODE_READONLY);