This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] elf.h SHF_EXCLUDE signed int 31 bit shift triggers undefined behaviour.


On Wed, 2015-04-22 at 11:18 +0200, Florian Weimer wrote:
> On 04/22/2015 10:14 AM, Florian Weimer wrote:
> > On 04/21/2015 11:20 AM, Mark Wielaard wrote:
> >> -#define SHF_EXCLUDE	     (1 << 31)	/* Section is excluded unless
> >> +#define SHF_EXCLUDE	     (1U << 31)	/* Section is excluded unless
> > 
> > I think the safer change is to use -0x80000000 as the value of the
> > constant, without making it unsigned.  Otherwise my previous objections
> > apply.
> 
> I thought some more about this, and have changed my opinion completely.
>  Making the constant unsigned is less risky than making it negative
> because of potential sign extension issues.  It's the lesser of two evils.
> 
> The proposed patch is okay with me.

Thanks. I didn't see other objections. So if it is good to go in could
someone please push it for me? (I don't have glibc git push access.)

ChangeLog

       * elf/elf.h (SHF_EXCLUDE): Use unsigned 1 for shift.

From 86771e8963653c306e53c07e1640914081afb30a Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw@redhat.com>
Date: Tue, 24 Mar 2015 11:32:36 +0100
Subject: [PATCH] elf.h SHF_EXCLUDE signed int 31 bit shift triggers undefined
 behaviour.

Any use of SHF_EXCLUDE in code that tries to check it against sh_flags
will trigger undefined behaviour because it is defined as a 31 bit shift
against an signed integer. Fix by explicitly using an unsigned int.
---
 ChangeLog | 4 ++++
 elf/elf.h | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/elf/elf.h b/elf/elf.h
index 71492a2..39bafc2 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -371,7 +371,7 @@ typedef struct
 #define SHF_MASKPROC	     0xf0000000	/* Processor-specific */
 #define SHF_ORDERED	     (1 << 30)	/* Special ordering requirement
 					   (Solaris).  */
-#define SHF_EXCLUDE	     (1 << 31)	/* Section is excluded unless
+#define SHF_EXCLUDE	     (1U << 31)	/* Section is excluded unless
 					   referenced or allocated (Solaris).*/
 
 /* Section group handling.  */
-- 
1.8.3.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]