changeset 8126:cf2c4f3c636f HEAD

mail_index_lookup_ext*() didn't return properly aligned pointers with updated transaction views.
author Timo Sirainen <tss@iki.fi>
date Sat, 30 Aug 2008 14:39:53 +0300
parents 81967ad7098f
children 8b0e3e27b551
files src/lib-index/mail-index-transaction-view.c
diffstat 1 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-transaction-view.c	Sat Aug 30 13:32:14 2008 +0300
+++ b/src/lib-index/mail-index-transaction-view.c	Sat Aug 30 14:39:53 2008 +0300
@@ -15,6 +15,7 @@
 
 	struct mail_index_map *lookup_map;
 	struct mail_index_header hdr;
+	buffer_t *lookup_return_data;
 };
 
 static void tview_close(struct mail_index_view *view)
@@ -25,6 +26,8 @@
 
 	if (tview->lookup_map != NULL)
 		mail_index_unmap(&tview->lookup_map);
+	if (tview->lookup_return_data != NULL)
+		buffer_free(&tview->lookup_return_data);
 
 	tview->super->close(view);
 	mail_index_transaction_unref(&t);
@@ -186,6 +189,38 @@
 	return tview->lookup_map;
 }
 
+static const void *
+tview_return_updated_ext(struct mail_index_view_transaction *tview,
+			 const void *data, uint32_t ext_id)
+{
+	const struct mail_index_ext *ext;
+	uint32_t ext_idx;
+
+	/* data begins with a 32bit sequence, followed by the actual
+	   extension data */
+	data = CONST_PTR_OFFSET(data, sizeof(uint32_t));
+
+	if (!mail_index_map_get_ext_idx(tview->lookup_map, ext_id, &ext_idx))
+		i_unreached();
+
+	ext = array_idx(&tview->lookup_map->extensions, ext_idx);
+	if (ext->record_align <= sizeof(uint32_t)) {
+		/* data is 32bit aligned already */
+		return data;
+	} else {
+		/* assume we want 64bit alignment - copy the data to
+		   temporary buffer and return it */
+		if (tview->lookup_return_data == NULL) {
+			tview->lookup_return_data =
+				buffer_create_dynamic(default_pool,
+						      ext->record_size + 64);
+		}
+		buffer_write(tview->lookup_return_data,
+			     0, data, ext->record_size);
+		return tview->lookup_return_data->data;
+	}
+}
+
 static void
 tview_lookup_ext_full(struct mail_index_view *view, uint32_t seq,
 		      uint32_t ext_id, struct mail_index_map **map_r,
@@ -210,7 +245,8 @@
 		    mail_index_seq_array_lookup(ext_buf, seq, &idx)) {
 			data = array_idx(ext_buf, idx);
 			*map_r = tview_get_lookup_map(tview);
-			*data_r = CONST_PTR_OFFSET(data, sizeof(uint32_t));
+			*data_r = tview_return_updated_ext(tview, data,
+							   ext_id);
 			return;
 		}
 	}