elf.h SHF_EXCLUDE signed int 31 bit shift triggers undefined behaviour.

Message ID 1430209326.1938.141.camel@bordewijk.wildebeest.org
State Committed
Headers

Commit Message

Mark Wielaard April 28, 2015, 8:22 a.m. UTC
  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.
  

Comments

Florian Weimer April 28, 2015, 12:01 p.m. UTC | #1
On 04/28/2015 10:22 AM, Mark Wielaard wrote:

> 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.
> 

Thanks, committed.
  

Patch

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