]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Add force initialization functable, because deflate captures function pointers from...
authorVladislav Shchapov <vladislav@shchapov.ru>
Sat, 16 Dec 2023 13:00:45 +0000 (18:00 +0500)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Thu, 21 Dec 2023 15:12:00 +0000 (16:12 +0100)
Signed-off-by: Vladislav Shchapov <vladislav@shchapov.ru>
deflate.c
functable.c
functable.h

index 735014516bcee0dd548c1309e60ebb87e06315bf..2a0a20e5d29a99e4352a93f05775063762fbac83 100644 (file)
--- a/deflate.c
+++ b/deflate.c
@@ -194,6 +194,9 @@ int32_t ZNG_CONDEXPORT PREFIX(deflateInit2)(PREFIX3(stream) *strm, int32_t level
     deflate_state *s;
     int wrap = 1;
 
+    /* Force initialization functable, because deflate captures function pointers from functable. */
+    functable.force_init();
+
     if (strm == NULL)
         return Z_STREAM_ERROR;
 
index f664d280d83bf972cd672b6b173743b5a601cf19..99fe735e27b46a03837dbb0d3f2ed2a3232fbd65 100644 (file)
 #include "functable.h"
 #include "cpu_features.h"
 
+static void force_init_empty(void) {
+    // empty
+}
+
 static void init_functable(void) {
     struct functable_s ft;
     struct cpu_features cf;
@@ -18,6 +22,7 @@ static void init_functable(void) {
     cpu_check_features(&cf);
 
     // Generic code
+    ft.force_init = &force_init_empty;
     ft.adler32 = &adler32_c;
     ft.adler32_fold_copy = &adler32_fold_copy_c;
     ft.chunkmemset_safe = &chunkmemset_safe_c;
@@ -234,6 +239,7 @@ static void init_functable(void) {
 #endif
 
     // Assign function pointers individually for atomic operation
+    functable.force_init = ft.force_init;
     functable.adler32 = ft.adler32;
     functable.adler32_fold_copy = ft.adler32_fold_copy;
     functable.chunkmemset_safe = ft.chunkmemset_safe;
@@ -254,6 +260,10 @@ static void init_functable(void) {
 }
 
 /* stub functions */
+static void force_init_stub(void) {
+    init_functable();
+}
+
 static uint32_t adler32_stub(uint32_t adler, const uint8_t* buf, size_t len) {
     init_functable();
     return functable.adler32(adler, buf, len);
@@ -341,6 +351,7 @@ static uint32_t update_hash_stub(deflate_state* const s, uint32_t h, uint32_t va
 
 /* functable init */
 Z_INTERNAL Z_TLS struct functable_s functable = {
+    force_init_stub,
     adler32_stub,
     adler32_fold_copy_stub,
     chunkmemset_safe_stub,
index 1cdfd4df415778137964a8e94435f722648e7cd4..b1742bade008d8a2a9368254d47f50a5489bd0f8 100644 (file)
@@ -17,6 +17,7 @@ typedef struct zng_stream_s zng_stream;
 #endif
 
 struct functable_s {
+    void     (* force_init)         (void);
     uint32_t (* adler32)            (uint32_t adler, const uint8_t *buf, size_t len);
     uint32_t (* adler32_fold_copy)  (uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
     uint8_t* (* chunkmemset_safe)   (uint8_t *out, unsigned dist, unsigned len, unsigned left);