Only define ZLIB_SHARED if it hasn't already been defined (on the command
[openssl.git] / crypto / comp / c_zlib.c
index c3167fcead0177f31825c14ac146ae3bde37355b..8263f7315d567bf11e0c61de6581908d8ddc7cf8 100644 (file)
@@ -3,6 +3,7 @@
 #include <string.h>
 #include <openssl/objects.h>
 #include <openssl/comp.h>
+#include <openssl/err.h>
 
 COMP_METHOD *COMP_zlib(void );
 
@@ -72,7 +73,9 @@ static COMP_METHOD zlib_stateful_method={
 # include <windows.h>
 
 # define Z_CALLCONV _stdcall
-# define ZLIB_SHARED
+# ifndef ZLIB_SHARED
+#  define ZLIB_SHARED
+# endif
 #else
 # define Z_CALLCONV
 #endif /* !(OPENSSL_SYS_WINDOWS || OPENSSL_SYS_WIN32) */
@@ -178,9 +181,12 @@ static int zlib_stateful_init(COMP_CTX *ctx)
        CRYPTO_new_ex_data(CRYPTO_EX_INDEX_COMP,ctx,&ctx->ex_data);
        if (zlib_stateful_ex_idx == -1)
                {
-               zlib_stateful_ex_idx =
-                       CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_COMP,
-                               0,NULL,NULL,NULL,zlib_stateful_free_ex_data);
+               CRYPTO_w_lock(CRYPTO_LOCK_COMP);
+               if (zlib_stateful_ex_idx == -1)
+                       zlib_stateful_ex_idx =
+                               CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_COMP,
+                                       0,NULL,NULL,NULL,zlib_stateful_free_ex_data);
+               CRYPTO_w_unlock(CRYPTO_LOCK_COMP);
                if (zlib_stateful_ex_idx == -1)
                        goto err;
                }
@@ -354,7 +360,17 @@ COMP_METHOD *COMP_zlib(void)
        if (!zlib_loaded)
                {
 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32)
-               zlib_dso = DSO_load(NULL, "ZLIB", NULL, 0);
+               zlib_dso = DSO_load(NULL, "ZLIB1", NULL, 0);
+               if (!zlib_dso)
+                       {
+                       zlib_dso = DSO_load(NULL, "ZLIB", NULL, 0);
+                       if (zlib_dso)
+                               {
+                               /* Clear the errors from the first failed
+                                  DSO_load() */
+                               ERR_clear_error();
+                               }
+                       }
 #else
                zlib_dso = DSO_load(NULL, "z", NULL, 0);
 #endif