On Fri, Jan 18, 2019 at 8:18 AM Tom de Vries <tdevr...@suse.de> wrote:
>
> On 18-01-19 16:40, Ian Lance Taylor wrote:
> >  int
> >  backtrace_get_view (struct backtrace_state *state ATTRIBUTE_UNUSED,
> > -                 int descriptor, off_t offset, size_t size,
> > +                 int descriptor, off_t offset, uint64_t size,
> >                   backtrace_error_callback error_callback,
> >                   void *data, struct backtrace_view *view)
> >  {
> > @@ -60,6 +60,12 @@ backtrace_get_view (struct backtrace_sta
> >    off_t pageoff;
> >    void *map;
> >
> > +  if ((uint64_t) (size_t) size != size)
> > +    {
> > +      error_callback (data, "file size too large", 0);
> > +      return 0;
> > +    }
> > +
>
> Agreed, this will fix the PR.

Thanks.  Committed to mainline.

> There's a cornercase I'm not sure is worth bothering about, but given
> that this is an RFC: in the case of 32-bit systems with 32-bit
> filesystem, there will be a range of numbers that fit in size_t, but are
> too large for off_t (both 32-bit but size_t unsigned and off_t signed),
> so in that case, the file size is too large, but we're not detecting
> that here. Though I think that should be handled in the subsequent mmap
> (or, in the case of read.c, in the subsequent read(), though I'm
> guessing the earlier backtrace_alloc > 2GB will already fail).

Yeah, I'm not worried about that case.  A system with a signed 32-bit
off_t can't really support files larger than 2G anyhow, since for
larger files the struct stat st_size field will be negative.

Ian

Reply via email to