public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "Dave Korn" <dave.korn@artimi.com>
To: "'H. J. Lu'" <hjl@lucon.org>, <binutils@sources.redhat.com>
Cc: "'GDB'" <gdb-patches@sources.redhat.com>
Subject: RE: PATCH: Fix read_leb128 in readelf for 64bit host
Date: Tue, 28 Dec 2004 13:15:00 -0000	[thread overview]
Message-ID: <NUTMEGNE6f17ro43pwu00000a9c@NUTMEG.CAM.ARTIMI.COM> (raw)
In-Reply-To: <20041227190130.GA21178@lucon.org>

> -----Original Message-----
> From: binutils-owner On Behalf Of H. J. Lu
> Sent: 27 December 2004 19:02

> On Sat, Dec 25, 2004 at 04:42:29PM -0800, H. J. Lu wrote:
> > read_leb128 in readelf assumes long == int == 32bit. It doesn't work
> > with 64bit host. Does this patch look right?
> > 
> > 
> 
> I am going to check in this patch. Gdb 6.3 has the same problem. I
> am enclosing a patch here.

> --- binutils/readelf.c.leb	2004-12-10 14:20:22.000000000 -0800
> +++ binutils/readelf.c	2004-12-27 10:49:33.689234088 -0800
> @@ -6933,7 +6933,7 @@ read_leb128 (unsigned char *data, int *l
>  {
>    unsigned long int result = 0;
>    unsigned int num_read = 0;
> -  int shift = 0;
> +  unsigned int shift = 0;
>    unsigned char byte;
>  
>    do
> @@ -6941,7 +6941,7 @@ read_leb128 (unsigned char *data, int *l
>        byte = *data++;
>        num_read++;
>  
> -      result |= (byte & 0x7f) << shift;
> +      result |= ((unsigned long int) (byte & 0x7f)) << shift;
>  
>        shift += 7;
>  
> @@ -6951,8 +6951,8 @@ read_leb128 (unsigned char *data, int *l
>    if (length_return != NULL)
>      *length_return = num_read;
>  
> -  if (sign && (shift < 32) && (byte & 0x40))
> -    result |= -1 << shift;
> +  if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
> +    result |= -1L << shift;
>  
>    return result;
>  }
> 

  IIRC the C spec says shift amounts >=32 are undefined behaviour, even in the
presence of larger integer types.  Is shift ever going to be >= 32 for 64 bit
hosts in these functions?  (I suspect it will).  If so, the shift must be
decomposed into two smaller shifts, no?

    cheers, 
      DaveK
-- 
Can't think of a witty .sigline today....

  reply	other threads:[~2004-12-28 13:15 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-26  0:42 H. J. Lu
2004-12-27 19:01 ` H. J. Lu
2004-12-28 13:15   ` Dave Korn [this message]
2004-12-28 14:57     ` Daniel Jacobowitz
2004-12-28 20:48       ` Dave Korn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=NUTMEGNE6f17ro43pwu00000a9c@NUTMEG.CAM.ARTIMI.COM \
    --to=dave.korn@artimi.com \
    --cc=binutils@sources.redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=hjl@lucon.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).