st_blocks incorrect for files larger than 2Gbytes

J. Johnston
Thu Jul 27 12:27:00 GMT 2000

Corinna Vinschen wrote:
> Egor Duda wrote:
> >
> > Hi!
> >
> >   newlib  declares  off_t  as signed long and cygwin's stat calculates
> > st_blocks   as
> >
> >   buf->st_blocks = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE;
> >
> > i.e. for file with size 2.164.854.784 bytes stat returns st_blocks=-2080187
> > or  big  positive value, when assigned to (unsigned long). this may be
> > fixed in a)newlib or b)cygwin or c)application
> >
> > which way is preferable?
> SUSv2 defines an own type blkcnt_t for that purpose. This
> might be the best way.

Are you referring to st_blocks like glibc does in bits/stat.h?  If so, then this won't solve
the problem.  The problem is that the division is being performed as signed.  The result when
assigned to either a signed or unsigned result will be incorrect.

POSIX states that st_size is off_t.  An easy solution to this without changing types is to just have
Cygwin do the cast: (unsigned long)buf->st_size in the calculation.  This gives the correct positive
value which can indeed be stored in st_blocks.

-- Jeff Johnston

More information about the Newlib mailing list