summaryrefslogtreecommitdiff
path: root/dovecot-2.3.16-ftbfsbigend.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dovecot-2.3.16-ftbfsbigend.patch')
-rw-r--r--dovecot-2.3.16-ftbfsbigend.patch53
1 files changed, 53 insertions, 0 deletions
diff --git a/dovecot-2.3.16-ftbfsbigend.patch b/dovecot-2.3.16-ftbfsbigend.patch
new file mode 100644
index 0000000..762503b
--- /dev/null
+++ b/dovecot-2.3.16-ftbfsbigend.patch
@@ -0,0 +1,53 @@
+commit ec4595097067a736717ef202fe8542b1b4bc2dd5
+Author: Timo Sirainen <timo.sirainen@open-xchange.com>
+Date: Tue Aug 10 12:22:08 2021 +0300
+
+ lib-index: Fix storing cache fields' last_used with 64bit big endian CPUs
+
+diff --git a/src/lib-index/mail-cache-fields.c b/src/lib-index/mail-cache-fields.c
+index e929fb559d..429e0d234c 100644
+--- a/src/lib-index/mail-cache-fields.c
++++ b/src/lib-index/mail-cache-fields.c
+@@ -524,6 +524,19 @@ static void copy_to_buf_byte(struct mail_cache *cache, buffer_t *dest,
+ }
+ }
+
++static void
++copy_to_buf_last_used(struct mail_cache *cache, buffer_t *dest, bool add_new)
++{
++ size_t offset = offsetof(struct mail_cache_field, last_used);
++#if defined(WORDS_BIGENDIAN) && SIZEOF_VOID_P == 8
++ /* 64bit time_t with big endian CPUs: copy the last 32 bits instead of
++ the first 32 bits (that are always 0). The 32 bits are enough until
++ year 2106, so we're not in a hurry to use 64 bits on disk. */
++ offset += sizeof(uint32_t);
++#endif
++ copy_to_buf(cache, dest, add_new, offset, sizeof(uint32_t));
++}
++
+ static int mail_cache_header_fields_update_locked(struct mail_cache *cache)
+ {
+ buffer_t *buffer;
+@@ -536,9 +549,7 @@ static int mail_cache_header_fields_update_locked(struct mail_cache *cache)
+
+ buffer = t_buffer_create(256);
+
+- copy_to_buf(cache, buffer, FALSE,
+- offsetof(struct mail_cache_field, last_used),
+- sizeof(uint32_t));
++ copy_to_buf_last_used(cache, buffer, FALSE);
+ ret = mail_cache_write(cache, buffer->data, buffer->used,
+ offset + MAIL_CACHE_FIELD_LAST_USED());
+ if (ret == 0) {
+@@ -599,9 +610,7 @@ void mail_cache_header_fields_get(struct mail_cache *cache, buffer_t *dest)
+ buffer_append(dest, &hdr, sizeof(hdr));
+
+ /* we have to keep the field order for the existing fields. */
+- copy_to_buf(cache, dest, TRUE,
+- offsetof(struct mail_cache_field, last_used),
+- sizeof(uint32_t));
++ copy_to_buf_last_used(cache, dest, TRUE);
+ copy_to_buf(cache, dest, TRUE,
+ offsetof(struct mail_cache_field, field_size),
+ sizeof(uint32_t));
+