Skip to content

Commit

Permalink
Fix misdetection of {crc32,alder32}_z in cloudflare zlib fork
Browse files Browse the repository at this point in the history
We use the Cloudflare fork of zlib
(https://github.com/cloudflare/zlib), which we find gives improved
performance on AWS Graviton ARM instances. That fork does not define
crc32_z and alder32_z functions.

Until two days ago, Ruby's zlib gem worked fine, because cloudflare zlib
_also_ did not define z_size_t, which meant Ruby did not try and use
these functions.

Since cloudflare/zlib@a3ba995
however, cloudflare zlib _does_ define z_size_t (but NOT crc32_z or
alder32_z). The zlib gem would try and use these nonexistant
functions and not compile.

This patch fixes it by actually specifically detecting the functions
that the gem wants to call, rather than just the presence of the
z_size_t type.
  • Loading branch information
KJ Tsanaktsidis committed Oct 15, 2023
1 parent 280a1b5 commit 967d89d
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 4 deletions.
8 changes: 6 additions & 2 deletions ext/zlib/extconf.rb
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,16 @@
$defs << "-DHAVE_CRC32_COMBINE"
$defs << "-DHAVE_ADLER32_COMBINE"
$defs << "-DHAVE_TYPE_Z_CRC_T"
$defs << "-DHAVE_TYPE_Z_SIZE_T"
$defs << "-DHAVE_CRC32_Z"
$defs << "-DHAVE_ALDER32_Z"
$defs << "-DHAVE_ZLIB_SIZE_T_FUNCS"
else
have_func('crc32_combine', 'zlib.h')
have_func('adler32_combine', 'zlib.h')
have_type('z_crc_t', 'zlib.h')
have_type('z_size_t', 'zlib.h')
if have_func('crc32_z', 'zlib.h') && have_func('alder32_z', 'zlib.h')
$defs << "-DHAVE_ZLIB_SIZE_T_FUNCS"
end
end

create_makefile('zlib') {|conf|
Expand Down
4 changes: 2 additions & 2 deletions ext/zlib/zlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
#endif
#endif

#if defined(HAVE_TYPE_Z_SIZE_T)
#if defined(HAVE_ZLIB_SIZE_T_FUNCS)
typedef uLong (*checksum_func)(uLong, const Bytef*, z_size_t);
# define crc32 crc32_z
# define adler32 adler32_z
Expand Down Expand Up @@ -388,7 +388,7 @@ rb_zlib_version(VALUE klass)
# define mask32(x) (x)
#endif

#if SIZEOF_LONG > SIZEOF_INT && !defined(HAVE_TYPE_Z_SIZE_T)
#if SIZEOF_LONG > SIZEOF_INT && !defined(HAVE_ZLIB_SIZE_T_FUNCS)
static uLong
checksum_long(uLong (*func)(uLong, const Bytef*, uInt), uLong sum, const Bytef *ptr, long len)
{
Expand Down

0 comments on commit 967d89d

Please sign in to comment.