From: Sergey Markelov Date: Thu, 22 Jul 2021 17:23:26 +0000 (-0700) Subject: Fix hangs on macOS due to loading of misaligned addresses in chunkmemset_8. X-Git-Tag: 2.0.6~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cdc8033a45ff2276676e434a0b22a4230a28071a;p=thirdparty%2Fzlib-ng.git Fix hangs on macOS due to loading of misaligned addresses in chunkmemset_8. --- diff --git a/chunkset_tpl.h b/chunkset_tpl.h index ff760fcf..be52ee9f 100644 --- a/chunkset_tpl.h +++ b/chunkset_tpl.h @@ -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;