Fix UB in bf_set_ui()
Ref: https://github.com/bellard/quickjs/issues/131
This commit is contained in:
parent
6b3bed1740
commit
148a205b71
1 changed files with 16 additions and 16 deletions
32
libbf.c
32
libbf.c
|
@ -164,6 +164,21 @@ static inline slimb_t sat_add(slimb_t a, slimb_t b)
|
|||
return r;
|
||||
}
|
||||
|
||||
static inline __maybe_unused limb_t shrd(limb_t low, limb_t high, long shift)
|
||||
{
|
||||
if (shift != 0)
|
||||
low = (low >> shift) | (high << (LIMB_BITS - shift));
|
||||
return low;
|
||||
}
|
||||
|
||||
static inline __maybe_unused limb_t shld(limb_t a1, limb_t a0, long shift)
|
||||
{
|
||||
if (shift != 0)
|
||||
return (a1 << shift) | (a0 >> (LIMB_BITS - shift));
|
||||
else
|
||||
return a1;
|
||||
}
|
||||
|
||||
#define malloc(s) malloc_is_forbidden(s)
|
||||
#define free(p) free_is_forbidden(p)
|
||||
#define realloc(p, s) realloc_is_forbidden(p, s)
|
||||
|
@ -236,7 +251,7 @@ int bf_set_ui(bf_t *r, uint64_t a)
|
|||
a1 = a >> 32;
|
||||
shift = clz(a1);
|
||||
r->tab[0] = a0 << shift;
|
||||
r->tab[1] = (a1 << shift) | (a0 >> (LIMB_BITS - shift));
|
||||
r->tab[1] = shld(a1, a0, shift);
|
||||
r->expn = 2 * LIMB_BITS - shift;
|
||||
}
|
||||
#endif
|
||||
|
@ -5388,21 +5403,6 @@ int bf_acos(bf_t *r, const bf_t *a, limb_t prec, bf_flags_t flags)
|
|||
|
||||
#endif /* LIMB_BITS != 64 */
|
||||
|
||||
static inline __maybe_unused limb_t shrd(limb_t low, limb_t high, long shift)
|
||||
{
|
||||
if (shift != 0)
|
||||
low = (low >> shift) | (high << (LIMB_BITS - shift));
|
||||
return low;
|
||||
}
|
||||
|
||||
static inline __maybe_unused limb_t shld(limb_t a1, limb_t a0, long shift)
|
||||
{
|
||||
if (shift != 0)
|
||||
return (a1 << shift) | (a0 >> (LIMB_BITS - shift));
|
||||
else
|
||||
return a1;
|
||||
}
|
||||
|
||||
#if LIMB_DIGITS == 19
|
||||
|
||||
/* WARNING: hardcoded for b = 1e19. It is assumed that:
|
||||
|
|
Loading…
Reference in a new issue