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:
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);