libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit e3dc813f16086d117987b4ef1eff5e0501de3965
parent dc244b7b45b605ea23d8efff46cf65c3f286d915
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Fri, 25 Apr 2025 18:36:03 +0200

mhd_str: fixed for platforms with sizeof(uint_fast32_t) > sizeof(uint32_t)

Diffstat:
Msrc/mhd2/mhd_str.c | 23++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/mhd2/mhd_str.c b/src/mhd2/mhd_str.c @@ -1395,27 +1395,30 @@ mhd_uint32_to_strx (uint_fast32_t val, { size_t o_pos = 0; /**< position of the output character */ int digit_pos = 8; /** zero-based, digit position in @a 'val' */ - int digit; + uint_least32_t val32 = ((uint_least32_t) val) & 0xFFFFFFFFu; + unsigned int xdigit; /* Skip leading zeros */ do { digit_pos--; - digit = (int) (val >> 28); - val <<= 4; - } while ((0 == digit) && (0 != digit_pos)); + xdigit = (unsigned int) (val32 >> 28); + val32 <<= 4; + val32 &= 0xFFFFFFFFu; + } while ((0 == xdigit) && (0 != digit_pos)); while (o_pos < buf_size) { buf[o_pos++] = - (char) ((digit <= 9) ? - ('0' + (char) digit) : - ('A' + (char) digit - 10)); + (char) ((xdigit <= 9) ? + ('0' + (char) xdigit) : + ('A' + (char) xdigit - 10)); if (0 == digit_pos) return o_pos; digit_pos--; - digit = (int) (val >> 28); - val <<= 4; + xdigit = (unsigned int) (val32 >> 28); + val32 <<= 4; + val32 &= 0xFFFFFFFFu; } return 0; /* The buffer is too small */ } @@ -1432,6 +1435,7 @@ mhd_uint16_to_str (uint_least16_t val, uint_least16_t divisor = UINT16_C (10000); int digit; + val &= 0xFFFFu; chr = buf; digit = (int) (val / divisor); mhd_assert (digit < 10); @@ -1473,6 +1477,7 @@ mhd_uint64_to_str (uint_fast64_t val, uint_fast64_t divisor = (uint_fast64_t) 10000000000000000000U; int digit; + val &= 0xFFFFFFFFFFFFFFFFu; chr = buf; digit = (int) (val / divisor); mhd_assert (digit < 10);