[GRASS-dev] [GRASS GIS] #1971: 64bit LFS support for G_ftell() and PRI_OFF_T gis.h

GRASS GIS trac at osgeo.org
Fri May 10 07:48:23 PDT 2013

#1971: 64bit LFS support for G_ftell() and PRI_OFF_T gis.h
 Reporter:  hamish                               |       Owner:  grass-dev@…              
     Type:  defect                               |      Status:  new                      
 Priority:  critical                             |   Milestone:  6.4.3                    
Component:  LibGIS                               |     Version:  svn-develbranch6         
 Keywords:  r.in.bin, LFS, G_ftell(), PRI_OFF_T  |    Platform:  Linux                    
      Cpu:  x86-64                               |  

Comment(by glynn):

 Replying to [comment:1 hamish]:

 > AFAICT r.in.bin is the only thing in GRASS 6 which uses G_ftell(), and
 nothing in the grass6-addons repo uses it. It was there in the 6.4.2
 release though, so someone might be using it in a personal addon program.
 Could it harm backwards compatibility to change the function def'n, or
 would it be harmless?

 The worst that can happen is that off_t gets truncated to int when the
 result is assigned (which doesn't apply to r.in.bin, which assigns the
 result of G_ftell() to an off_t), rather than within G_ftell().

 The truncation to int was done in r45468, but I don't know why. Possibly
 to avoid issues with off_t having different sizes in different files
 (didn't LFS have to be enabled on a module-by-module basis in 6.x?).

 The irony is that having G_fseek() return int is even worse than using
 plain fseek(), which returns a long. This imposes a 32-bit limit even on
 "real" 64-bit platforms (i.e. not Windows, where even the 64-bit versions
 have a 32-bit long).

 At the very least, G_fseek() should return a long, if not an off_t.

 > Seeing that it is only r.in.bin, a less invasive fix to get the 6.4.3
 release out the door might be to add the `#ifdef HAVE_FSEEKO` test into
 r.in.bin directly and avoid using G_ftell() altogether.

 7.0 has 31 uses of G_ftell() and 48 uses of G_fseek() (although a bunch of
 those are in r.viewshed and r.terraflow, which all come from the same
 AMI_STREAM template). The fact that 6.x only has one use indicate that
 everything else is using plain ftell(), which means that it will fail on
 files larger than 2GiB.

Ticket URL: <https://trac.osgeo.org/grass/ticket/1971#comment:2>
GRASS GIS <http://grass.osgeo.org>

More information about the grass-dev mailing list