[GRASS-dev] [GRASS GIS] #166: short integer overflow with r.in.gdal

GRASS GIS trac at osgeo.org
Tue May 13 13:18:04 EDT 2008


#166: short integer overflow with r.in.gdal
---------------------+------------------------------------------------------
 Reporter:  dylan    |       Owner:  grass-dev at lists.osgeo.org
     Type:  defect   |      Status:  new                      
 Priority:  major    |   Milestone:  6.4.0                    
Component:  default  |     Version:  unspecified              
 Keywords:           |  
---------------------+------------------------------------------------------
 Noticed that importing Arc ASCII grid files with r.in.gdal can lead to
 data corruption when the input file contains integer values larger than
 what can be stored in a short integer (>32767). See the test case and
 attached file below.

 test case:
 {{{
 # setup in spearfish60 location
 g.region res=1000 -pa

 # make a map with values larger than what a short integer can hold
 r.mapcalc "large_int_map = rand(10000, 78000)"

 # check raster info:
 r.info large_int_map -r
 min=10000
 max=77594

 # export to Arc ASCII format
 r.out.arc in=large_int_map out=big_int_arc_file.asc



 # import with GDAL:
 r.in.gdal -o in=big_int_arc_file.asc out=big_int_arc_file

 # we are stuck with short integer values and data corruption:
 r.info big_int_arc_file -r
 min=-31293
 max=32420
 }}}

 It looks like the culprit may be associated with the following lines from
 the r.out.gdal source (main.c:677 | revision 31323):

 {{{
 /* -------------------------------------------------------------------- */
 /*      Select a cell type for the new cell.                            */
 /* -------------------------------------------------------------------- */
     eRawGDT = GDALGetRasterDataType( hBand );

     switch(eRawGDT) {
       case GDT_Float32:
       case GDT_Float64:
         data_type = FCELL_TYPE;
         eGDT = GDT_Float32;
         complex = FALSE;
         break;

       case GDT_Byte:
         data_type = CELL_TYPE;
         eGDT = GDT_Int32;
         complex = FALSE;
         G_set_cell_format(0);
         /* raster_open_new_func = G_open_raster_new_uncompressed;*/ /* ??
 */
         break;

       case GDT_Int16:
       case GDT_UInt16:
         data_type = CELL_TYPE;
         eGDT = GDT_Int32;
         complex = FALSE;
         G_set_cell_format(1);
         /* raster_open_new_func = G_open_raster_new_uncompressed;*/ /* ??
 */
         break;

       default:
         data_type = CELL_TYPE;
         eGDT = GDT_Int32;
         complex = FALSE;
         G_set_cell_format(3);
         break;
     }

 }}}

-- 
Ticket URL: <http://trac.osgeo.org/grass/ticket/166>
GRASS GIS <http://grass.osgeo.org>


More information about the grass-dev mailing list