mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
math: Fix UB on sinhf (BZ 32921)
The left shift overflows for 'int', use uint64_t instead. It syncs with CORE-MATH commit bbfabd99. Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
Copyright (c) 2022-2024 Alexei Sibidanov.
|
Copyright (c) 2022-2024 Alexei Sibidanov.
|
||||||
|
|
||||||
The original version of this file was copied from the CORE-MATH
|
The original version of this file was copied from the CORE-MATH
|
||||||
project (file src/binary32/sinh/sinhf.c, revision 572ecec).
|
project (file src/binary32/sinh/sinhf.c, revision bbfabd99).
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -83,8 +83,8 @@ __ieee754_sinhf (float x)
|
|||||||
double h2 = h * h;
|
double h2 = h * h;
|
||||||
int64_t jp = asuint64 (ia + 0x1.8p52);
|
int64_t jp = asuint64 (ia + 0x1.8p52);
|
||||||
int64_t jm = -jp;
|
int64_t jm = -jp;
|
||||||
double sp = asdouble (TB[jp & 31] + ((jp >> 5) << 52));
|
double sp = asdouble (TB[jp & 31] + ((uint64_t)(jp >> 5) << 52));
|
||||||
double sm = asdouble (TB[jm & 31] + ((jm >> 5) << 52));
|
double sm = asdouble (TB[jm & 31] + ((uint64_t)(jm >> 5) << 52));
|
||||||
double te = C[0] + h2 * C[2];
|
double te = C[0] + h2 * C[2];
|
||||||
double to = (C[1] + h2 * C[3]);
|
double to = (C[1] + h2 * C[3]);
|
||||||
double rp = sp * (te + h * to);
|
double rp = sp * (te + h * to);
|
||||||
|
Reference in New Issue
Block a user