]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Fix hangs on macOS due to loading of misaligned addresses in chunkmemset_8.
authorSergey Markelov <sergey@solidstatenetworks.com>
Thu, 22 Jul 2021 17:23:26 +0000 (10:23 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Fri, 24 Dec 2021 11:52:14 +0000 (12:52 +0100)
chunkset_tpl.h

index ff760fcf691ff2fde855003c5ef03ba9b58f5b50..be52ee9f2fbdf43dac2248db72e82d1a69304f19 100644 (file)
@@ -114,10 +114,10 @@ Z_INTERNAL uint8_t* CHUNKMEMSET(uint8_t *out, unsigned dist, unsigned len) {
     chunk_t chunk;
     unsigned sz = sizeof(chunk);
     if (len < sz) {
-        do {
+        while (len != 0) {
             *out++ = *from++;
             --len;
-        } while (len != 0);
+        }
         return out;
     }
 
@@ -176,9 +176,24 @@ Z_INTERNAL uint8_t* CHUNKMEMSET(uint8_t *out, unsigned dist, unsigned len) {
 }
 
 Z_INTERNAL uint8_t* CHUNKMEMSET_SAFE(uint8_t *out, unsigned dist, unsigned len, unsigned left) {
+#if !defined(UNALIGNED64_OK)
+#  if !defined(UNALIGNED_OK)
+    static const uint32_t align_mask = 7;
+#  else
+    static const uint32_t align_mask = 3;
+#  endif
+#endif
+
     len = MIN(len, left);
+    uint8_t *from = out - dist;
+#if !defined(UNALIGNED64_OK)
+    while (((uintptr_t)out & align_mask) && (len > 0)) {
+        *out++ = *from++;
+        --len;
+        --left;
+    }
+#endif
     if (left < (unsigned)(3 * sizeof(chunk_t))) {
-        uint8_t *from = out - dist;
         while (len > 0) {
             *out++ = *from++;
             --len;