]> sourceware.org Git - glibc.git/commitdiff
hppa: Fix undefined behaviour in feclearexcept (BZ 30983)
authorBruno Haible <bruno@clisp.org>
Thu, 2 Nov 2023 19:19:44 +0000 (16:19 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 19 Dec 2023 18:12:38 +0000 (15:12 -0300)
The expression

  (excepts & FE_ALL_EXCEPT) << 27

produces a signed integer overflow when 'excepts' is specified as
FE_INVALID (= 0x10), because
  - excepts is of type 'int',
  - FE_ALL_EXCEPT is of type 'int',
  - thus (excepts & FE_ALL_EXCEPT) is (int) 0x10,
  - 'int' is 32 bits wide.

The patched code produces the same instruction sequence as
previosuly.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
sysdeps/hppa/fpu/fclrexcpt.c

index 055fb04ccc4375a345e192e2f7d1a6815a0ed87a..46caf39ec1ae6ac44902eb35f015c878837f6706 100644 (file)
@@ -26,7 +26,7 @@ feclearexcept (int excepts)
   /* Get the current status word. */
   __asm__ ("fstd %%fr0,0(%1)" : "=m" (s.l) : "r" (&s.l) : "%r0");
   /* Clear all the relevant bits. */
-  s.sw[0] &= ~((excepts & FE_ALL_EXCEPT) << 27);
+  s.sw[0] &= ~(((unsigned int) excepts & FE_ALL_EXCEPT) << 27);
   __asm__ ("fldd 0(%0),%%fr0" : : "r" (&s.l), "m" (s.l) : "%r0");
 
   /* Success.  */
This page took 0.041819 seconds and 5 git commands to generate.