Hi Giuseppe,

> +      long pos = ftell (stream);
> +      if (pos < 0)
> +        return NULL;

Not every regular file is seekable (think of files under /proc
on Linux). Therefore, of 'ftello' fails, it's better to not pre-allocate
a buffer but start reading from the stream, like for non-regular files.

> +      buf = malloc (alloc);
> +      if (!buf)
> +        return NULL;

Here, when malloc() fails, you want errno to be set to ENOMEM. For this
to be guaranteed, the module description needs to have a dependency on
'malloc-posix'.

Paul Eggert wrote:
> > +      alloc = st.st_size - pos + 1;
> 
> The assignment could overflow, since off_t might be
> wider than size_t.  This must be checked for

Yes. Additionally, pos may be > st.st_size on some files (think of
files like /proc/pid/maps on Linux). Check against that as well.

> and errno should be set to ENOMEM if overflow occurs.

I disagree. In this case there's likely something fishy with the fstat
results, and it's better to start reading from the stream, like for
non-regular files.

If you want to check against overflow, it should certainly also happen in
the loop, here:

          alloc += alloc / 2;
          if (alloc < size + BUFSIZ + 1)
            alloc = size + BUFSIZ + 1;

In this case, returning with ENOMEM is appropriate.

Bruno

Reply via email to