public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] s390: Fix undefined behaviour in feenableexcept, fedisableexcept [BZ #30960]
@ 2023-10-19 12:29 Stefan Liebler
  0 siblings, 0 replies; only message in thread
From: Stefan Liebler @ 2023-10-19 12:29 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=97a58d885b01ecf432e0d96248556245a232597e

commit 97a58d885b01ecf432e0d96248556245a232597e
Author: Stefan Liebler <stli@linux.ibm.com>
Date:   Wed Oct 18 15:08:40 2023 +0200

    s390: Fix undefined behaviour in feenableexcept, fedisableexcept [BZ #30960]
    
    If feenableexcept or fedisableexcept gets excepts=FE_INVALID=0x80
    as input, we have a signed left shift: 0x80 << 24 which is not
    representable as int and thus is undefined behaviour according to
    C standard.
    
    This patch casts excepts as unsigned int before shifting, which is
    defined.
    
    For me, the observed undefined behaviour is that the shift is done
    with "unsigned"-instructions, which is exactly what we want.
    Furthermore, I don't get any exception-flags.
    
    After the fix, the code is using the same instruction sequence as
    before.

Diff:
---
 sysdeps/s390/fpu/fedisblxcpt.c | 3 ++-
 sysdeps/s390/fpu/feenablxcpt.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/sysdeps/s390/fpu/fedisblxcpt.c b/sysdeps/s390/fpu/fedisblxcpt.c
index 728f103f43..55634c299f 100644
--- a/sysdeps/s390/fpu/fedisblxcpt.c
+++ b/sysdeps/s390/fpu/fedisblxcpt.c
@@ -26,7 +26,8 @@ fedisableexcept (int excepts)
 
   _FPU_GETCW (temp);
   old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT;
-  new_flags = (temp & (~((excepts & FE_ALL_EXCEPT) << FPC_EXCEPTION_MASK_SHIFT)));
+  new_flags = (temp & ~(((unsigned int) excepts & FE_ALL_EXCEPT)
+			<< FPC_EXCEPTION_MASK_SHIFT));
   _FPU_SETCW (new_flags);
 
   return old_exc;
diff --git a/sysdeps/s390/fpu/feenablxcpt.c b/sysdeps/s390/fpu/feenablxcpt.c
index 0807e610a2..d73659f078 100644
--- a/sysdeps/s390/fpu/feenablxcpt.c
+++ b/sysdeps/s390/fpu/feenablxcpt.c
@@ -26,7 +26,8 @@ feenableexcept (int excepts)
 
   _FPU_GETCW (temp);
   old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT;
-  new_flags = (temp | ((excepts & FE_ALL_EXCEPT) <<  FPC_EXCEPTION_MASK_SHIFT));
+  new_flags = (temp | (((unsigned int) excepts & FE_ALL_EXCEPT)
+		       << FPC_EXCEPTION_MASK_SHIFT));
   _FPU_SETCW (new_flags);
 
   return old_exc;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-19 12:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-19 12:29 [glibc] s390: Fix undefined behaviour in feenableexcept, fedisableexcept [BZ #30960] Stefan Liebler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).