On 6. Dec 2021, at 23.09, Adrian Bunk <b...@debian.org> wrote:
> 
> On Mon, Oct 25, 2021 at 08:54:45PM +0200, Christian Göttsche wrote:
>> The source of these test failure is LTO: it built fine with GCC 10.3
>> with LTO a month ago on buildd, GCC 11 without LTO works and Clang 13
>> with LTO also works.
>> So either there is some subtle undefined behaviour in dovecot (which
>> gets miscompiled) or the code generation in GCC 11 is buggy (maybe
>> related [1]).
>> 
>> For the mean time the simplest solution is probably to disable LTO
>> ...
> 
> Could you do this as temprorary workaround?

Looks like disabling the md4/md5 little-endian optimizations fixes this as 
well. I'll try to figure out the proper fix in upstream.

diff --git a/src/lib/md4.c b/src/lib/md4.c
index 06e3231bde..798292a16f 100644
--- a/src/lib/md4.c
+++ b/src/lib/md4.c
@@ -42,7 +42,7 @@
  * memory accesses is just an optimization.  Nothing will break if it
  * doesn't work.
  */
-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
+#if 0 //defined(__i386__) || defined(__x86_64__) || defined(__vax__)
 /* uint_fast32_t might be 64 bit, and thus may read 4 more bytes
  * beyond the end of the buffer. So only read precisely 32 bits
  */
diff --git a/src/lib/md5.c b/src/lib/md5.c
index 6b5da6c307..c605639aa1 100644
--- a/src/lib/md5.c
+++ b/src/lib/md5.c
@@ -46,7 +46,7 @@
  * memory accesses is just an optimization.  Nothing will break if it
  * doesn't work.
  */
-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
+#if 0 //defined(__i386__) || defined(__x86_64__) || defined(__vax__)
 #define SET(n) \
        (*(const uint32_t *)&ptr[(n) * 4])
 #define GET(n) \

Reply via email to