From 90978db11472619d30ccb4d67ff3111742964c6e Mon Sep 17 00:00:00 2001 From: Dustin Howett Date: Wed, 13 Oct 2021 14:16:49 -0700 Subject: [PATCH] windows: make sure we use the right calling convention for libc --- libarchive/archive_blake2_impl.h | 2 +- libarchive/archive_blake2s_ref.c | 1 + libarchive/archive_blake2sp_ref.c | 1 + libarchive/archive_pack_dev.c | 3 ++- libarchive/archive_platform.h | 8 ++++++++ libarchive/archive_write_set_format_iso9660.c | 2 ++ 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/libarchive/archive_blake2_impl.h b/libarchive/archive_blake2_impl.h index 0f05defea..eb8619ca7 100644 --- a/libarchive/archive_blake2_impl.h +++ b/libarchive/archive_blake2_impl.h @@ -154,7 +154,7 @@ static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c ) /* prevents compiler optimizing out memset() */ static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n) { - static void *(*const volatile memset_v)(void *, int, size_t) = &memset; + static void *(__LA_LIBC_CC *const volatile memset_v)(void *, int, size_t) = &memset; memset_v(v, 0, n); } diff --git a/libarchive/archive_blake2s_ref.c b/libarchive/archive_blake2s_ref.c index d92ffd0fc..b21a02ba6 100644 --- a/libarchive/archive_blake2s_ref.c +++ b/libarchive/archive_blake2s_ref.c @@ -17,6 +17,7 @@ #include #include +#include "archive_platform.h" #include "archive_blake2.h" #include "archive_blake2_impl.h" diff --git a/libarchive/archive_blake2sp_ref.c b/libarchive/archive_blake2sp_ref.c index aef101084..f412c8e2a 100644 --- a/libarchive/archive_blake2sp_ref.c +++ b/libarchive/archive_blake2sp_ref.c @@ -21,6 +21,7 @@ #include #endif +#include "archive_platform.h" #include "archive_blake2.h" #include "archive_blake2_impl.h" diff --git a/libarchive/archive_pack_dev.c b/libarchive/archive_pack_dev.c index f8286d821..d95444d97 100644 --- a/libarchive/archive_pack_dev.c +++ b/libarchive/archive_pack_dev.c @@ -77,7 +77,7 @@ static pack_t pack_12_20; static pack_t pack_14_18; static pack_t pack_8_24; static pack_t pack_bsdos; -static int compare_format(const void *, const void *); +static int __LA_LIBC_CC compare_format(const void *, const void *); static const char iMajorError[] = "invalid major number"; static const char iMinorError[] = "invalid minor number"; @@ -310,6 +310,7 @@ static const struct format { }; static int +__LA_LIBC_CC compare_format(const void *key, const void *element) { const char *name; diff --git a/libarchive/archive_platform.h b/libarchive/archive_platform.h index b8bcb52bc..9fef68fad 100644 --- a/libarchive/archive_platform.h +++ b/libarchive/archive_platform.h @@ -69,8 +69,16 @@ * either Windows or Posix APIs. */ #if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__) #include "archive_windows.h" +/* The C library on Windows specifies a calling convention for callback + * functions and exports; when we interact with them (capture pointers, + * call and pass function pointers) we need to match their calling + * convention. + * This only matters when libarchive is built with /Gr, /Gz or /Gv + * (which change the default calling convention.) */ +#define __LA_LIBC_CC __cdecl #else #define la_stat(path,stref) stat(path,stref) +#define __LA_LIBC_CC #endif /* diff --git a/libarchive/archive_write_set_format_iso9660.c b/libarchive/archive_write_set_format_iso9660.c index faabd28ea..58b7216a8 100644 --- a/libarchive/archive_write_set_format_iso9660.c +++ b/libarchive/archive_write_set_format_iso9660.c @@ -6802,6 +6802,7 @@ isoent_rr_move(struct archive_write *a) * This comparing rule is according to ISO9660 Standard 6.9.1 */ static int +__LA_LIBC_CC _compare_path_table(const void *v1, const void *v2) { const struct isoent *p1, *p2; @@ -6844,6 +6845,7 @@ _compare_path_table(const void *v1, const void *v2) } static int +__LA_LIBC_CC _compare_path_table_joliet(const void *v1, const void *v2) { const struct isoent *p1, *p2; -- 2.47.2