This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] elf.h SHF_EXCLUDE signed int 31 bit shift triggers undefined behaviour.
- From: Mark Wielaard <mjw at redhat dot com>
- To: Florian Weimer <fweimer at redhat dot com>
- Cc: Szabolcs Nagy <szabolcs dot nagy at arm dot com>, "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>, Josh Stone <jistone at redhat dot com>
- Date: Tue, 28 Apr 2015 10:22:06 +0200
- Subject: Re: [PATCH] elf.h SHF_EXCLUDE signed int 31 bit shift triggers undefined behaviour.
- Authentication-results: sourceware.org; auth=none
- References: <1427193579-26102-1-git-send-email-mjw at redhat dot com> <55117118 dot 1080706 at arm dot com> <20150324211541 dot GA2318 at blokker dot redhat dot com> <1429608058 dot 1938 dot 53 dot camel at bordewijk dot wildebeest dot org> <5537587D dot 5020707 at redhat dot com> <55376772 dot 9000207 at redhat dot com>
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