From b77ad1d4c9165935726e6d9a90bc42d5e2a876ed Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 28 Jul 1999 23:19:26 +0000 Subject: [PATCH] Fix an overflow checking bug uncovered when a 32 bit target is compiled with a 64 bit bfd. --- gas/ChangeLog | 7 +++++++ gas/config/tc-i386.c | 4 ++-- gas/write.c | 20 ++++---------------- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 3b535ad5e07..7116952e9c8 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +1999-07-29 Alan Modra + + * write.c (fixup_segment): Fix generic error check overflow test. + + * config/tc-i386.c (pe): Change %d to %ld, %x to %lx, and cast + X_add_number to long. + Wed Jul 28 02:04:24 1999 "Jerry Quinn" * config/tc-hppa.c (pa_ip): Add 'J' and 'K' code diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 30c9abf5c21..524819e8308 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -777,8 +777,8 @@ pe (e) expressionS *e; { fprintf (stdout, " operation %d\n", e->X_op); - fprintf (stdout, " add_number %d (%x)\n", - e->X_add_number, e->X_add_number); + fprintf (stdout, " add_number %ld (%lx)\n", + (long) e->X_add_number, (long) e->X_add_number); if (e->X_add_symbol) { fprintf (stdout, " add_symbol "); diff --git a/gas/write.c b/gas/write.c index 0c28ac7fd91..536e76d007c 100644 --- a/gas/write.c +++ b/gas/write.c @@ -2733,24 +2733,12 @@ fixup_segment (fixP, this_segment_type) { if ((size_t) size < sizeof (valueT)) { - valueT mask, hibit; + valueT mask; - /* set all bits to one */ mask = 0; - mask--; - /* Technically, combining these produces an undefined result - if size is sizeof (valueT), though I think these two - half-way operations should both be defined. And the - compiler should be able to combine them if it's valid on - the host architecture. */ - mask <<= size * 4; - mask <<= size * 4; - hibit = (valueT) 1 << (size * 8 - 1); - if (((add_number & mask) != 0 - || (fixP->fx_signed - && (add_number & hibit) != 0)) - && ((add_number & mask) != mask - || (add_number & hibit) == 0)) + mask--; /* set all bits to one */ + mask <<= size * 8 - (fixP->fx_signed ? 1 : 0); + if ((add_number & mask) != 0 && (add_number & mask) != mask) { char buf[50], buf2[50]; sprint_value (buf, fragP->fr_address + where); -- 2.30.2