From: Debian R Packages Maintainers Date: Thu, 3 Oct 2024 23:37:27 +0000 (+0900) Subject: Fix BN_ext_get_uint64 for OpenSSL >= 1.1 32bit X-Git-Tag: archive/raspbian/1.1.7-1+rpi1^2~2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a1462539e67fd4336aeea60fa1ccf76e8a908d8d;p=r-cran-s2.git Fix BN_ext_get_uint64 for OpenSSL >= 1.1 32bit Origin: upstream Bug: https://github.com/google/s2geometry/pull/183 Forwarded: no Reviewed-by: Étienne Mollier Last-Update: 2021-10-04 Suggested changes fix compilation error with OpenSSL >= 1.0 for 32bit target. The algorithm is similar to what is currently being done in BN_ext_set_uint64, but in the opposite direction. Last-Update: 2021-10-04 Gbp-Pq: Name fix-ftbfs-on-32bit.patch --- diff --git a/src/s2/util/math/exactfloat/exactfloat.cc b/src/s2/util/math/exactfloat/exactfloat.cc index ee645b6..b7bf45b 100644 --- a/src/s2/util/math/exactfloat/exactfloat.cc +++ b/src/s2/util/math/exactfloat/exactfloat.cc @@ -75,6 +75,22 @@ inline static uint64 BN_ext_get_uint64(const BIGNUM* bn) { return u64; } +// Return the absolute value of a BIGNUM as a 64-bit unsigned integer. +// Requires that BIGNUM fits into 64 bits. +inline static uint64 BN_ext_get_uint64(const BIGNUM* bn) { + uint64 r; +#ifdef IS_LITTLE_ENDIAN + S2_CHECK_EQ(BN_bn2lebinpad(bn, reinterpret_cast(&r), + sizeof(r)), sizeof(r)); +#elif IS_BIG_ENDIAN + S2_CHECK_EQ(BN_bn2binpad(bn, reinterpret_cast(&r), + sizeof(r)), sizeof(r)); +#else +#error one of IS_LITTLE_ENDIAN or IS_BIG_ENDIAN should be defined! +#endif + return r; +} + static int BN_ext_count_low_zero_bits(const BIGNUM* bn) { return BN_count_low_zero_bits(bn); }