From e68a5c7f5c7c8d65c8e713ece57068459fd252cc Mon Sep 17 00:00:00 2001 From: Micah Snyder Date: Thu, 17 Aug 2023 18:18:51 -0700 Subject: [PATCH] Windows: json-c 0.17 compatibility with ssize_t type definition json-c 0.17 defines the ssize_t type using a typedef on Windows. We have been setting ssize_t for Windows to a different type using a #define instead of a typedef. We should have been using a typedef since it is a type. However, we must also match the exact type they're setting it to or else the compiler will baulk because the types are different. Note: in C11, it's fine to use typedef the same type more than once, so long as you're defining it the same every time. --- CMakeLists.txt | 4 ++-- clamav-config.h.cmake.in | 19 +++++++++++++++---- win32/compat/net.h | 8 +++++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cb04257c50..db92252ae6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -682,13 +682,13 @@ check_type_size("ssize_t" SIZEOF_SSIZE_T) if(SIZEOF_SSIZE_T STREQUAL "") # ssize_t is a signed type in POSIX storing at least -1. # Set it to "int" to match the behavior of AC_TYPE_SSIZE_T (autotools). - set(ssize_t int) + set(SSIZE_T_DEF "typedef int ssize_t;") endif() check_type_size("off_t" SIZEOF_OFF_T) if(SIZEOF_OFF_T STREQUAL "") # off_t is a signed type in POSIX no narrower than int. # Set it to "long int" to match the behavior of AC_TYPE_OFF_T (autotools). - set(off_t long int) + set(OFF_T_DEF "typedef long int off_t;") endif() check_type_size("int" SIZEOF_INT) diff --git a/clamav-config.h.cmake.in b/clamav-config.h.cmake.in index b21af87782..4f3b837c01 100644 --- a/clamav-config.h.cmake.in +++ b/clamav-config.h.cmake.in @@ -587,11 +587,22 @@ #define inline @INLINE_KEYWORD@ #endif -/* Define to `long int' if does not define. */ -#cmakedefine off_t @off_t@ - /* Define to `int' if does not define. */ -#cmakedefine ssize_t @ssize_t@ +#ifndef SSIZE_T_DEFINED + #if defined(_MSC_VER) + #include + typedef SSIZE_T ssize_t; + #else + @SSIZE_T_DEF@ + #endif + # define SSIZE_T_DEFINED +#endif + +/* Define to `long int' if does not define. */ +#ifndef OFF_T_DEFINED + @OFF_T_DEF@ + #define OFF_T_DEFINED +#endif /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is diff --git a/win32/compat/net.h b/win32/compat/net.h index 655373aa94..7c2b9b6e39 100644 --- a/win32/compat/net.h +++ b/win32/compat/net.h @@ -24,9 +24,15 @@ /* Don't include clamav-config.h, because that brings in platform.h and platform.h will make these functions recursive ;-). */ -#ifndef ssize_t +#ifndef SSIZE_T_DEFINED +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#else typedef int ssize_t; #endif +#define SSIZE_T_DEFINED +#endif #define F_GETFL 1 #define F_SETFL 2