Home | History | Annotate | Download | only in libtiff
      1 /* $Id: tif_read.c,v 1.59 2017-05-13 15:34:06 erouault Exp $ */
      2 
      3 /*
      4  * Copyright (c) 1988-1997 Sam Leffler
      5  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
      6  *
      7  * Permission to use, copy, modify, distribute, and sell this software and
      8  * its documentation for any purpose is hereby granted without fee, provided
      9  * that (i) the above copyright notices and this permission notice appear in
     10  * all copies of the software and related documentation, and (ii) the names of
     11  * Sam Leffler and Silicon Graphics may not be used in any advertising or
     12  * publicity relating to the software without the specific, prior written
     13  * permission of Sam Leffler and Silicon Graphics.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
     16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
     17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
     18  *
     19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
     20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
     21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
     22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
     23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
     24  * OF THIS SOFTWARE.
     25  */
     26 
     27 /*
     28  * TIFF Library.
     29  * Scanline-oriented Read Support
     30  */
     31 #include "tiffiop.h"
     32 #include <stdio.h>
     33 
     34 #define TIFF_SIZE_T_MAX ((size_t) ~ ((size_t)0))
     35 #define TIFF_TMSIZE_T_MAX (tmsize_t)(TIFF_SIZE_T_MAX >> 1)
     36 
     37 int TIFFFillStrip(TIFF* tif, uint32 strip);
     38 int TIFFFillTile(TIFF* tif, uint32 tile);
     39 static int TIFFStartStrip(TIFF* tif, uint32 strip);
     40 static int TIFFStartTile(TIFF* tif, uint32 tile);
     41 static int TIFFCheckRead(TIFF*, int);
     42 static tmsize_t
     43 TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size,const char* module);
     44 static tmsize_t
     45 TIFFReadRawTile1(TIFF* tif, uint32 tile, void* buf, tmsize_t size, const char* module);
     46 
     47 #define NOSTRIP ((uint32)(-1))       /* undefined state */
     48 #define NOTILE ((uint32)(-1))         /* undefined state */
     49 
     50 #define INITIAL_THRESHOLD (1024 * 1024)
     51 #define THRESHOLD_MULTIPLIER 10
     52 #define MAX_THRESHOLD (THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * INITIAL_THRESHOLD)
     53 
     54 /* Read 'size' bytes in tif_rawdata buffer starting at offset 'rawdata_offset'
     55  * Returns 1 in case of success, 0 otherwise. */
     56 static int TIFFReadAndRealloc( TIFF* tif, tmsize_t size,
     57                                tmsize_t rawdata_offset,
     58                                int is_strip, uint32 strip_or_tile,
     59                                const char* module )
     60 {
     61 #if SIZEOF_VOIDP == 8 || SIZEOF_SIZE_T == 8
     62         tmsize_t threshold = INITIAL_THRESHOLD;
     63 #endif
     64         tmsize_t already_read = 0;
     65 
     66         /* On 64 bit processes, read first a maximum of 1 MB, then 10 MB, etc */
     67         /* so as to avoid allocating too much memory in case the file is too */
     68         /* short. We could ask for the file size, but this might be */
     69         /* expensive with some I/O layers (think of reading a gzipped file) */
     70         /* Restrict to 64 bit processes, so as to avoid reallocs() */
     71         /* on 32 bit processes where virtual memory is scarce.  */
     72         while( already_read < size )
     73         {
     74             tmsize_t bytes_read;
     75             tmsize_t to_read = size - already_read;
     76 #if SIZEOF_VOIDP == 8 || SIZEOF_SIZE_T == 8
     77             if( to_read >= threshold && threshold < MAX_THRESHOLD &&
     78                 already_read + to_read + rawdata_offset > tif->tif_rawdatasize )
     79             {
     80                 to_read = threshold;
     81                 threshold *= THRESHOLD_MULTIPLIER;
     82             }
     83 #endif
     84             if (already_read + to_read + rawdata_offset > tif->tif_rawdatasize) {
     85                 uint8* new_rawdata;
     86                 assert((tif->tif_flags & TIFF_MYBUFFER) != 0);
     87                 tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64(
     88                         (uint64)already_read + to_read + rawdata_offset, 1024);
     89                 if (tif->tif_rawdatasize==0) {
     90                     TIFFErrorExt(tif->tif_clientdata, module,
     91                                 "Invalid buffer size");
     92                     return 0;
     93                 }
     94                 new_rawdata = (uint8*) _TIFFrealloc(
     95                                 tif->tif_rawdata, tif->tif_rawdatasize);
     96                 if( new_rawdata == 0 )
     97                 {
     98                     TIFFErrorExt(tif->tif_clientdata, module,
     99                         "No space for data buffer at scanline %lu",
    100                         (unsigned long) tif->tif_row);
    101                     _TIFFfree(tif->tif_rawdata);
    102                     tif->tif_rawdata = 0;
    103                     tif->tif_rawdatasize = 0;
    104                     return 0;
    105                 }
    106                 tif->tif_rawdata = new_rawdata;
    107             }
    108 
    109             bytes_read = TIFFReadFile(tif,
    110                 tif->tif_rawdata + rawdata_offset + already_read, to_read);
    111             already_read += bytes_read;
    112             if (bytes_read != to_read) {
    113                 memset( tif->tif_rawdata + rawdata_offset + already_read, 0,
    114                         tif->tif_rawdatasize - rawdata_offset - already_read );
    115 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
    116                 if( is_strip )
    117                 {
    118                     TIFFErrorExt(tif->tif_clientdata, module,
    119                         "Read error at scanline %lu; got %I64u bytes, "
    120                         "expected %I64u",
    121                                         (unsigned long) tif->tif_row,
    122                                         (unsigned __int64) already_read,
    123                                         (unsigned __int64) size);
    124                 }
    125                 else
    126                 {
    127                     TIFFErrorExt(tif->tif_clientdata, module,
    128                         "Read error at row %lu, col %lu, tile %lu; "
    129                         "got %I64u bytes, expected %I64u",
    130                                         (unsigned long) tif->tif_row,
    131                                         (unsigned long) tif->tif_col,
    132                                         (unsigned long) strip_or_tile,
    133                                         (unsigned __int64) already_read,
    134                                         (unsigned __int64) size);
    135                 }
    136 #else
    137                 if( is_strip )
    138                 {
    139                     TIFFErrorExt(tif->tif_clientdata, module,
    140                         "Read error at scanline %lu; got %llu bytes, "
    141                         "expected %llu",
    142                                         (unsigned long) tif->tif_row,
    143                                         (unsigned long long) already_read,
    144                                         (unsigned long long) size);
    145                 }
    146                 else
    147                 {
    148                     TIFFErrorExt(tif->tif_clientdata, module,
    149                         "Read error at row %lu, col %lu, tile %lu; "
    150                         "got %llu bytes, expected %llu",
    151                                         (unsigned long) tif->tif_row,
    152                                         (unsigned long) tif->tif_col,
    153                                         (unsigned long) strip_or_tile,
    154                                         (unsigned long long) already_read,
    155                                         (unsigned long long) size);
    156                 }
    157 #endif
    158                 return 0;
    159             }
    160         }
    161         return 1;
    162 }
    163 
    164 
    165 static int
    166 TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart )
    167 {
    168 	static const char module[] = "TIFFFillStripPartial";
    169 	register TIFFDirectory *td = &tif->tif_dir;
    170         tmsize_t unused_data;
    171         uint64 read_offset;
    172         tmsize_t to_read;
    173         tmsize_t read_ahead_mod;
    174         /* tmsize_t bytecountm; */
    175 
    176         if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount)
    177             return 0;
    178 
    179         /*
    180          * Expand raw data buffer, if needed, to hold data
    181          * strip coming from file (perhaps should set upper
    182          * bound on the size of a buffer we'll use?).
    183          */
    184 
    185         /* bytecountm=(tmsize_t) td->td_stripbytecount[strip]; */
    186 
    187         /* Not completely sure where the * 2 comes from, but probably for */
    188         /* an exponentional growth strategy of tif_rawdatasize */
    189         if( read_ahead < TIFF_TMSIZE_T_MAX / 2 )
    190                 read_ahead_mod = read_ahead * 2;
    191         else
    192                 read_ahead_mod = read_ahead;
    193         if (read_ahead_mod > tif->tif_rawdatasize) {
    194                 assert( restart );
    195 
    196                 tif->tif_curstrip = NOSTRIP;
    197                 if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
    198                         TIFFErrorExt(tif->tif_clientdata, module,
    199                                      "Data buffer too small to hold part of strip %lu",
    200                                      (unsigned long) strip);
    201                         return (0);
    202                 }
    203         }
    204 
    205         if( restart )
    206         {
    207                 tif->tif_rawdataloaded = 0;
    208                 tif->tif_rawdataoff = 0;
    209         }
    210 
    211         /*
    212         ** If we are reading more data, move any unused data to the
    213         ** start of the buffer.
    214         */
    215         if( tif->tif_rawdataloaded > 0 )
    216                 unused_data = tif->tif_rawdataloaded - (tif->tif_rawcp - tif->tif_rawdata);
    217         else
    218                 unused_data = 0;
    219 
    220         if( unused_data > 0 )
    221         {
    222 		assert((tif->tif_flags&TIFF_BUFFERMMAP)==0);
    223                 memmove( tif->tif_rawdata, tif->tif_rawcp, unused_data );
    224         }
    225 
    226         /*
    227         ** Seek to the point in the file where more data should be read.
    228         */
    229         read_offset = td->td_stripoffset[strip]
    230                 + tif->tif_rawdataoff + tif->tif_rawdataloaded;
    231 
    232         if (!SeekOK(tif, read_offset)) {
    233                 TIFFErrorExt(tif->tif_clientdata, module,
    234                              "Seek error at scanline %lu, strip %lu",
    235                              (unsigned long) tif->tif_row, (unsigned long) strip);
    236                 return 0;
    237         }
    238 
    239         /*
    240         ** How much do we want to read?
    241         */
    242         if( read_ahead_mod > tif->tif_rawdatasize )
    243                 to_read = read_ahead_mod - unused_data;
    244         else
    245                 to_read = tif->tif_rawdatasize - unused_data;
    246         if( (uint64) to_read > td->td_stripbytecount[strip]
    247             - tif->tif_rawdataoff - tif->tif_rawdataloaded )
    248         {
    249                 to_read = (tmsize_t) td->td_stripbytecount[strip]
    250                         - tif->tif_rawdataoff - tif->tif_rawdataloaded;
    251         }
    252 
    253 	assert((tif->tif_flags&TIFF_BUFFERMMAP)==0);
    254         if( !TIFFReadAndRealloc( tif, to_read, unused_data,
    255                                  1, /* is_strip */
    256                                  0, /* strip_or_tile */
    257                                  module) )
    258         {
    259                 return 0;
    260         }
    261 
    262         tif->tif_rawdataoff = tif->tif_rawdataoff + tif->tif_rawdataloaded - unused_data ;
    263         tif->tif_rawdataloaded = unused_data + to_read;
    264 
    265         tif->tif_rawcp = tif->tif_rawdata;
    266 
    267         if (!isFillOrder(tif, td->td_fillorder) &&
    268             (tif->tif_flags & TIFF_NOBITREV) == 0) {
    269 		assert((tif->tif_flags&TIFF_BUFFERMMAP)==0);
    270                 TIFFReverseBits(tif->tif_rawdata + unused_data, to_read );
    271 	}
    272 
    273         /*
    274         ** When starting a strip from the beginning we need to
    275         ** restart the decoder.
    276         */
    277         if( restart )
    278                 return TIFFStartStrip(tif, strip);
    279         else
    280         {
    281                 tif->tif_rawcc = tif->tif_rawdataloaded;
    282                 return 1;
    283         }
    284 }
    285 
    286 /*
    287  * Seek to a random row+sample in a file.
    288  *
    289  * Only used by TIFFReadScanline, and is only used on
    290  * strip organized files.  We do some tricky stuff to try
    291  * and avoid reading the whole compressed raw data for big
    292  * strips.
    293  */
    294 static int
    295 TIFFSeek(TIFF* tif, uint32 row, uint16 sample )
    296 {
    297 	register TIFFDirectory *td = &tif->tif_dir;
    298 	uint32 strip;
    299         int    whole_strip;
    300 	tmsize_t read_ahead = 0;
    301 
    302         /*
    303         ** Establish what strip we are working from.
    304         */
    305 	if (row >= td->td_imagelength) {	/* out of range */
    306 		TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
    307 		    "%lu: Row out of range, max %lu",
    308 		    (unsigned long) row,
    309 		    (unsigned long) td->td_imagelength);
    310 		return (0);
    311 	}
    312 	if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
    313 		if (sample >= td->td_samplesperpixel) {
    314 			TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
    315 			    "%lu: Sample out of range, max %lu",
    316 			    (unsigned long) sample, (unsigned long) td->td_samplesperpixel);
    317 			return (0);
    318 		}
    319 		strip = (uint32)sample*td->td_stripsperimage + row/td->td_rowsperstrip;
    320 	} else
    321 		strip = row / td->td_rowsperstrip;
    322 
    323         /*
    324          * Do we want to treat this strip as one whole chunk or
    325          * read it a few lines at a time?
    326          */
    327 #if defined(CHUNKY_STRIP_READ_SUPPORT)
    328         if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount)
    329             return 0;
    330         whole_strip = tif->tif_dir.td_stripbytecount[strip] < 10
    331                 || isMapped(tif);
    332 #else
    333         whole_strip = 1;
    334 #endif
    335 
    336         if( !whole_strip )
    337         {
    338                 /* 16 is for YCbCr mode where we may need to read 16 */
    339                 /* lines at a time to get a decompressed line, and 5000 */
    340                 /* is some constant value, for example for JPEG tables */
    341                 if( tif->tif_scanlinesize < TIFF_TMSIZE_T_MAX / 16 &&
    342                     tif->tif_scanlinesize * 16 < TIFF_TMSIZE_T_MAX - 5000 )
    343                 {
    344                         read_ahead = tif->tif_scanlinesize * 16 + 5000;
    345                 }
    346                 else
    347                 {
    348                         read_ahead = tif->tif_scanlinesize;
    349                 }
    350         }
    351 
    352         /*
    353          * If we haven't loaded this strip, do so now, possibly
    354          * only reading the first part.
    355          */
    356 	if (strip != tif->tif_curstrip) {	/* different strip, refill */
    357 
    358                 if( whole_strip )
    359                 {
    360                         if (!TIFFFillStrip(tif, strip))
    361                                 return (0);
    362                 }
    363                 else
    364                 {
    365                         if( !TIFFFillStripPartial(tif,strip,read_ahead,1) )
    366                                 return 0;
    367                 }
    368 	}
    369 
    370         /*
    371         ** If we already have some data loaded, do we need to read some more?
    372         */
    373         else if( !whole_strip )
    374         {
    375                 if( ((tif->tif_rawdata + tif->tif_rawdataloaded) - tif->tif_rawcp) < read_ahead
    376                     && (uint64) tif->tif_rawdataoff+tif->tif_rawdataloaded < td->td_stripbytecount[strip] )
    377                 {
    378                         if( !TIFFFillStripPartial(tif,strip,read_ahead,0) )
    379                                 return 0;
    380                 }
    381         }
    382 
    383         if (row < tif->tif_row) {
    384 		/*
    385 		 * Moving backwards within the same strip: backup
    386 		 * to the start and then decode forward (below).
    387 		 *
    388 		 * NB: If you're planning on lots of random access within a
    389 		 * strip, it's better to just read and decode the entire
    390 		 * strip, and then access the decoded data in a random fashion.
    391 		 */
    392 
    393                 if( tif->tif_rawdataoff != 0 )
    394                 {
    395                         if( !TIFFFillStripPartial(tif,strip,read_ahead,1) )
    396                                 return 0;
    397                 }
    398                 else
    399                 {
    400                         if (!TIFFStartStrip(tif, strip))
    401                                 return (0);
    402                 }
    403 	}
    404 
    405 	if (row != tif->tif_row) {
    406 		/*
    407 		 * Seek forward to the desired row.
    408 		 */
    409 
    410                 /* TODO: Will this really work with partial buffers? */
    411 
    412 		if (!(*tif->tif_seek)(tif, row - tif->tif_row))
    413 			return (0);
    414 		tif->tif_row = row;
    415 	}
    416 
    417 	return (1);
    418 }
    419 
    420 int
    421 TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
    422 {
    423 	int e;
    424 
    425 	if (!TIFFCheckRead(tif, 0))
    426 		return (-1);
    427 	if( (e = TIFFSeek(tif, row, sample)) != 0) {
    428 		/*
    429 		 * Decompress desired row into user buffer.
    430 		 */
    431 		e = (*tif->tif_decoderow)
    432 		    (tif, (uint8*) buf, tif->tif_scanlinesize, sample);
    433 
    434 		/* we are now poised at the beginning of the next row */
    435 		tif->tif_row = row + 1;
    436 
    437 		if (e)
    438 			(*tif->tif_postdecode)(tif, (uint8*) buf,
    439 			    tif->tif_scanlinesize);
    440 	}
    441 	return (e > 0 ? 1 : -1);
    442 }
    443 
    444 /*
    445  * Calculate the strip size according to the number of
    446  * rows in the strip (check for truncated last strip on any
    447  * of the separations).
    448  */
    449 static tmsize_t TIFFReadEncodedStripGetStripSize(TIFF* tif, uint32 strip, uint16* pplane)
    450 {
    451 	static const char module[] = "TIFFReadEncodedStrip";
    452 	TIFFDirectory *td = &tif->tif_dir;
    453 	uint32 rowsperstrip;
    454 	uint32 stripsperplane;
    455 	uint32 stripinplane;
    456 	uint32 rows;
    457 	tmsize_t stripsize;
    458 	if (!TIFFCheckRead(tif,0))
    459 		return((tmsize_t)(-1));
    460 	if (strip>=td->td_nstrips)
    461 	{
    462 		TIFFErrorExt(tif->tif_clientdata,module,
    463 		    "%lu: Strip out of range, max %lu",(unsigned long)strip,
    464 		    (unsigned long)td->td_nstrips);
    465 		return((tmsize_t)(-1));
    466 	}
    467 
    468 	rowsperstrip=td->td_rowsperstrip;
    469 	if (rowsperstrip>td->td_imagelength)
    470 		rowsperstrip=td->td_imagelength;
    471 	stripsperplane= TIFFhowmany_32_maxuint_compat(td->td_imagelength, rowsperstrip);
    472 	stripinplane=(strip%stripsperplane);
    473 	if( pplane ) *pplane=(uint16)(strip/stripsperplane);
    474 	rows=td->td_imagelength-stripinplane*rowsperstrip;
    475 	if (rows>rowsperstrip)
    476 		rows=rowsperstrip;
    477 	stripsize=TIFFVStripSize(tif,rows);
    478 	if (stripsize==0)
    479 		return((tmsize_t)(-1));
    480     return stripsize;
    481 }
    482 
    483 /*
    484  * Read a strip of data and decompress the specified
    485  * amount into the user-supplied buffer.
    486  */
    487 tmsize_t
    488 TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size)
    489 {
    490   static const char module[] = "TIFFReadEncodedStrip";
    491   TIFFDirectory *td = &tif->tif_dir;
    492   tmsize_t stripsize;
    493   uint16 plane;
    494 
    495   stripsize=TIFFReadEncodedStripGetStripSize(tif, strip, &plane);
    496   if (stripsize==((tmsize_t)(-1)))
    497       return((tmsize_t)(-1));
    498 
    499     /* shortcut to avoid an extra memcpy() */
    500     if( td->td_compression == COMPRESSION_NONE &&
    501         size!=(tmsize_t)(-1) && size >= stripsize &&
    502         !isMapped(tif) &&
    503         ((tif->tif_flags&TIFF_NOREADRAW)==0) )
    504     {
    505         if (TIFFReadRawStrip1(tif, strip, buf, stripsize, module) != stripsize)
    506             return ((tmsize_t)(-1));
    507 
    508         if (!isFillOrder(tif, td->td_fillorder) &&
    509             (tif->tif_flags & TIFF_NOBITREV) == 0)
    510             TIFFReverseBits(buf,stripsize);
    511 
    512         (*tif->tif_postdecode)(tif,buf,stripsize);
    513         return (stripsize);
    514     }
    515 
    516 	if ((size!=(tmsize_t)(-1))&&(size<stripsize))
    517 		stripsize=size;
    518 	if (!TIFFFillStrip(tif,strip))
    519 		return((tmsize_t)(-1));
    520 	if ((*tif->tif_decodestrip)(tif,buf,stripsize,plane)<=0)
    521 		return((tmsize_t)(-1));
    522 	(*tif->tif_postdecode)(tif,buf,stripsize);
    523 	return(stripsize);
    524 }
    525 
    526 /* Variant of TIFFReadEncodedStrip() that does
    527  * * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillStrip() has
    528  *   suceeded. This avoid excessive memory allocation in case of truncated
    529  *   file.
    530  * * calls regular TIFFReadEncodedStrip() if *buf != NULL
    531  */
    532 tmsize_t
    533 _TIFFReadEncodedStripAndAllocBuffer(TIFF* tif, uint32 strip,
    534                                     void **buf, tmsize_t bufsizetoalloc,
    535                                     tmsize_t size_to_read)
    536 {
    537     tmsize_t this_stripsize;
    538     uint16 plane;
    539 
    540     if( *buf != NULL )
    541     {
    542         return TIFFReadEncodedStrip(tif, strip, *buf, size_to_read);
    543     }
    544 
    545     this_stripsize=TIFFReadEncodedStripGetStripSize(tif, strip, &plane);
    546     if (this_stripsize==((tmsize_t)(-1)))
    547             return((tmsize_t)(-1));
    548 
    549     if ((size_to_read!=(tmsize_t)(-1))&&(size_to_read<this_stripsize))
    550             this_stripsize=size_to_read;
    551     if (!TIFFFillStrip(tif,strip))
    552             return((tmsize_t)(-1));
    553 
    554     *buf = _TIFFmalloc(bufsizetoalloc);
    555     if (*buf == NULL) {
    556             TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer");
    557             return((tmsize_t)(-1));
    558     }
    559     _TIFFmemset(*buf, 0, bufsizetoalloc);
    560 
    561     if ((*tif->tif_decodestrip)(tif,*buf,this_stripsize,plane)<=0)
    562             return((tmsize_t)(-1));
    563     (*tif->tif_postdecode)(tif,*buf,this_stripsize);
    564     return(this_stripsize);
    565 
    566 
    567 }
    568 
    569 
    570 static tmsize_t
    571 TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size,
    572     const char* module)
    573 {
    574 	TIFFDirectory *td = &tif->tif_dir;
    575 
    576     if (!_TIFFFillStriles( tif ))
    577         return ((tmsize_t)(-1));
    578 
    579 	assert((tif->tif_flags&TIFF_NOREADRAW)==0);
    580 	if (!isMapped(tif)) {
    581 		tmsize_t cc;
    582 
    583 		if (!SeekOK(tif, td->td_stripoffset[strip])) {
    584 			TIFFErrorExt(tif->tif_clientdata, module,
    585 			    "Seek error at scanline %lu, strip %lu",
    586 			    (unsigned long) tif->tif_row, (unsigned long) strip);
    587 			return ((tmsize_t)(-1));
    588 		}
    589 		cc = TIFFReadFile(tif, buf, size);
    590 		if (cc != size) {
    591 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
    592 			TIFFErrorExt(tif->tif_clientdata, module,
    593 		"Read error at scanline %lu; got %I64u bytes, expected %I64u",
    594 				     (unsigned long) tif->tif_row,
    595 				     (unsigned __int64) cc,
    596 				     (unsigned __int64) size);
    597 #else
    598 			TIFFErrorExt(tif->tif_clientdata, module,
    599 		"Read error at scanline %lu; got %llu bytes, expected %llu",
    600 				     (unsigned long) tif->tif_row,
    601 				     (unsigned long long) cc,
    602 				     (unsigned long long) size);
    603 #endif
    604 			return ((tmsize_t)(-1));
    605 		}
    606 	} else {
    607 		tmsize_t ma = 0;
    608 		tmsize_t n;
    609 		if ((td->td_stripoffset[strip] > (uint64)TIFF_TMSIZE_T_MAX)||
    610                     ((ma=(tmsize_t)td->td_stripoffset[strip])>tif->tif_size))
    611                 {
    612                     n=0;
    613                 }
    614                 else if( ma > TIFF_TMSIZE_T_MAX - size )
    615                 {
    616                     n=0;
    617                 }
    618                 else
    619                 {
    620                     tmsize_t mb=ma+size;
    621                     if (mb>tif->tif_size)
    622                             n=tif->tif_size-ma;
    623                     else
    624                             n=size;
    625                 }
    626 		if (n!=size) {
    627 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
    628 			TIFFErrorExt(tif->tif_clientdata, module,
    629 	"Read error at scanline %lu, strip %lu; got %I64u bytes, expected %I64u",
    630 				     (unsigned long) tif->tif_row,
    631 				     (unsigned long) strip,
    632 				     (unsigned __int64) n,
    633 				     (unsigned __int64) size);
    634 #else
    635 			TIFFErrorExt(tif->tif_clientdata, module,
    636 	"Read error at scanline %lu, strip %lu; got %llu bytes, expected %llu",
    637 				     (unsigned long) tif->tif_row,
    638 				     (unsigned long) strip,
    639 				     (unsigned long long) n,
    640 				     (unsigned long long) size);
    641 #endif
    642 			return ((tmsize_t)(-1));
    643 		}
    644 		_TIFFmemcpy(buf, tif->tif_base + ma,
    645 			    size);
    646 	}
    647 	return (size);
    648 }
    649 
    650 static tmsize_t
    651 TIFFReadRawStripOrTile2(TIFF* tif, uint32 strip_or_tile, int is_strip,
    652                         tmsize_t size, const char* module)
    653 {
    654         TIFFDirectory *td = &tif->tif_dir;
    655 
    656         assert( !isMapped(tif) );
    657         assert((tif->tif_flags&TIFF_NOREADRAW)==0);
    658 
    659         if (!SeekOK(tif, td->td_stripoffset[strip_or_tile])) {
    660             if( is_strip )
    661             {
    662                 TIFFErrorExt(tif->tif_clientdata, module,
    663                     "Seek error at scanline %lu, strip %lu",
    664                     (unsigned long) tif->tif_row,
    665                     (unsigned long) strip_or_tile);
    666             }
    667             else
    668             {
    669                 TIFFErrorExt(tif->tif_clientdata, module,
    670                     "Seek error at row %lu, col %lu, tile %lu",
    671                     (unsigned long) tif->tif_row,
    672                     (unsigned long) tif->tif_col,
    673                     (unsigned long) strip_or_tile);
    674             }
    675             return ((tmsize_t)(-1));
    676         }
    677 
    678         if( !TIFFReadAndRealloc( tif, size, 0, is_strip,
    679                                  strip_or_tile, module ) )
    680         {
    681             return ((tmsize_t)(-1));
    682         }
    683 
    684         return (size);
    685 }
    686 
    687 /*
    688  * Read a strip of data from the file.
    689  */
    690 tmsize_t
    691 TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size)
    692 {
    693 	static const char module[] = "TIFFReadRawStrip";
    694 	TIFFDirectory *td = &tif->tif_dir;
    695 	uint64 bytecount;
    696 	tmsize_t bytecountm;
    697 
    698 	if (!TIFFCheckRead(tif, 0))
    699 		return ((tmsize_t)(-1));
    700 	if (strip >= td->td_nstrips) {
    701 		TIFFErrorExt(tif->tif_clientdata, module,
    702 		     "%lu: Strip out of range, max %lu",
    703 		     (unsigned long) strip,
    704 		     (unsigned long) td->td_nstrips);
    705 		return ((tmsize_t)(-1));
    706 	}
    707 	if (tif->tif_flags&TIFF_NOREADRAW)
    708 	{
    709 		TIFFErrorExt(tif->tif_clientdata, module,
    710 		    "Compression scheme does not support access to raw uncompressed data");
    711 		return ((tmsize_t)(-1));
    712 	}
    713 	bytecount = td->td_stripbytecount[strip];
    714 	if ((int64)bytecount <= 0) {
    715 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
    716 		TIFFErrorExt(tif->tif_clientdata, module,
    717 			     "%I64u: Invalid strip byte count, strip %lu",
    718 			     (unsigned __int64) bytecount,
    719 			     (unsigned long) strip);
    720 #else
    721 		TIFFErrorExt(tif->tif_clientdata, module,
    722 			     "%llu: Invalid strip byte count, strip %lu",
    723 			     (unsigned long long) bytecount,
    724 			     (unsigned long) strip);
    725 #endif
    726 		return ((tmsize_t)(-1));
    727 	}
    728 	bytecountm = (tmsize_t)bytecount;
    729 	if ((uint64)bytecountm!=bytecount) {
    730 		TIFFErrorExt(tif->tif_clientdata, module, "Integer overflow");
    731 		return ((tmsize_t)(-1));
    732 	}
    733 	if (size != (tmsize_t)(-1) && size < bytecountm)
    734 		bytecountm = size;
    735 	return (TIFFReadRawStrip1(tif, strip, buf, bytecountm, module));
    736 }
    737 
    738 /*
    739  * Read the specified strip and setup for decoding. The data buffer is
    740  * expanded, as necessary, to hold the strip's data.
    741  */
    742 int
    743 TIFFFillStrip(TIFF* tif, uint32 strip)
    744 {
    745 	static const char module[] = "TIFFFillStrip";
    746 	TIFFDirectory *td = &tif->tif_dir;
    747 
    748         if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount)
    749             return 0;
    750 
    751 	if ((tif->tif_flags&TIFF_NOREADRAW)==0)
    752 	{
    753 		uint64 bytecount = td->td_stripbytecount[strip];
    754 		if ((int64)bytecount <= 0) {
    755 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
    756 			TIFFErrorExt(tif->tif_clientdata, module,
    757 				"Invalid strip byte count %I64u, strip %lu",
    758 				     (unsigned __int64) bytecount,
    759 				     (unsigned long) strip);
    760 #else
    761 			TIFFErrorExt(tif->tif_clientdata, module,
    762 				"Invalid strip byte count %llu, strip %lu",
    763 				     (unsigned long long) bytecount,
    764 				     (unsigned long) strip);
    765 #endif
    766 			return (0);
    767 		}
    768 
    769 		/* To avoid excessive memory allocations: */
    770 		/* Byte count should normally not be larger than a number of */
    771 		/* times the uncompressed size plus some margin */
    772                 if( bytecount > 1024 * 1024 )
    773                 {
    774 			/* 10 and 4096 are just values that could be adjusted. */
    775 			/* Hopefully they are safe enough for all codecs */
    776 			tmsize_t stripsize = TIFFStripSize(tif);
    777 			if( stripsize != 0 &&
    778 			    (bytecount - 4096) / 10 > (uint64)stripsize  )
    779 			{
    780 				uint64 newbytecount = (uint64)stripsize * 10 + 4096;
    781 				if( (int64)newbytecount >= 0 )
    782 				{
    783 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
    784 					TIFFWarningExt(tif->tif_clientdata, module,
    785 					  "Too large strip byte count %I64u, strip %lu. Limiting to %I64u",
    786 					     (unsigned __int64) bytecount,
    787 					     (unsigned long) strip,
    788 					     (unsigned __int64) newbytecount);
    789 #else
    790 					TIFFErrorExt(tif->tif_clientdata, module,
    791 					  "Too large strip byte count %llu, strip %lu. Limiting to %llu",
    792 					     (unsigned long long) bytecount,
    793 					     (unsigned long) strip,
    794 					     (unsigned long long) newbytecount);
    795 #endif
    796 					bytecount = newbytecount;
    797 				}
    798 			}
    799 		}
    800 
    801 		if (isMapped(tif) &&
    802 		    (isFillOrder(tif, td->td_fillorder)
    803 		    || (tif->tif_flags & TIFF_NOBITREV))) {
    804 			/*
    805 			 * The image is mapped into memory and we either don't
    806 			 * need to flip bits or the compression routine is
    807 			 * going to handle this operation itself.  In this
    808 			 * case, avoid copying the raw data and instead just
    809 			 * reference the data from the memory mapped file
    810 			 * image.  This assumes that the decompression
    811 			 * routines do not modify the contents of the raw data
    812 			 * buffer (if they try to, the application will get a
    813 			 * fault since the file is mapped read-only).
    814 			 */
    815 			if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
    816 				_TIFFfree(tif->tif_rawdata);
    817 				tif->tif_rawdata = NULL;
    818 				tif->tif_rawdatasize = 0;
    819 			}
    820 			tif->tif_flags &= ~TIFF_MYBUFFER;
    821 			/*
    822 			 * We must check for overflow, potentially causing
    823 			 * an OOB read. Instead of simple
    824 			 *
    825 			 *  td->td_stripoffset[strip]+bytecount > tif->tif_size
    826 			 *
    827 			 * comparison (which can overflow) we do the following
    828 			 * two comparisons:
    829 			 */
    830 			if (bytecount > (uint64)tif->tif_size ||
    831 			    td->td_stripoffset[strip] > (uint64)tif->tif_size - bytecount) {
    832 				/*
    833 				 * This error message might seem strange, but
    834 				 * it's what would happen if a read were done
    835 				 * instead.
    836 				 */
    837 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
    838 				TIFFErrorExt(tif->tif_clientdata, module,
    839 
    840 					"Read error on strip %lu; "
    841 					"got %I64u bytes, expected %I64u",
    842 					(unsigned long) strip,
    843 					(unsigned __int64) tif->tif_size - td->td_stripoffset[strip],
    844 					(unsigned __int64) bytecount);
    845 #else
    846 				TIFFErrorExt(tif->tif_clientdata, module,
    847 
    848 					"Read error on strip %lu; "
    849 					"got %llu bytes, expected %llu",
    850 					(unsigned long) strip,
    851 					(unsigned long long) tif->tif_size - td->td_stripoffset[strip],
    852 					(unsigned long long) bytecount);
    853 #endif
    854 				tif->tif_curstrip = NOSTRIP;
    855 				return (0);
    856 			}
    857 			tif->tif_rawdatasize = (tmsize_t)bytecount;
    858 			tif->tif_rawdata = tif->tif_base + (tmsize_t)td->td_stripoffset[strip];
    859                         tif->tif_rawdataoff = 0;
    860                         tif->tif_rawdataloaded = (tmsize_t) bytecount;
    861 
    862 			/*
    863 			 * When we have tif_rawdata reference directly into the memory mapped file
    864 			 * we need to be pretty careful about how we use the rawdata.  It is not
    865 			 * a general purpose working buffer as it normally otherwise is.  So we
    866 			 * keep track of this fact to avoid using it improperly.
    867 			 */
    868 			tif->tif_flags |= TIFF_BUFFERMMAP;
    869 		} else {
    870 			/*
    871 			 * Expand raw data buffer, if needed, to hold data
    872 			 * strip coming from file (perhaps should set upper
    873 			 * bound on the size of a buffer we'll use?).
    874 			 */
    875 			tmsize_t bytecountm;
    876 			bytecountm=(tmsize_t)bytecount;
    877 			if ((uint64)bytecountm!=bytecount)
    878 			{
    879 				TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
    880 				return(0);
    881 			}
    882 			if (bytecountm > tif->tif_rawdatasize) {
    883 				tif->tif_curstrip = NOSTRIP;
    884 				if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
    885 					TIFFErrorExt(tif->tif_clientdata, module,
    886 					    "Data buffer too small to hold strip %lu",
    887 					    (unsigned long) strip);
    888 					return (0);
    889 				}
    890 			}
    891 			if (tif->tif_flags&TIFF_BUFFERMMAP) {
    892 				tif->tif_curstrip = NOSTRIP;
    893 				tif->tif_rawdata = NULL;
    894 				tif->tif_rawdatasize = 0;
    895 				tif->tif_flags &= ~TIFF_BUFFERMMAP;
    896 			}
    897 
    898 			if( isMapped(tif) )
    899 			{
    900 				if (bytecountm > tif->tif_rawdatasize &&
    901 				    !TIFFReadBufferSetup(tif, 0, bytecountm))
    902 				{
    903 					return (0);
    904 				}
    905 				if (TIFFReadRawStrip1(tif, strip, tif->tif_rawdata,
    906 				    bytecountm, module) != bytecountm)
    907 				{
    908 					return (0);
    909 				}
    910 			}
    911 			else
    912 			{
    913 				if (TIFFReadRawStripOrTile2(tif, strip, 1,
    914 				    bytecountm, module) != bytecountm)
    915 				{
    916 					return (0);
    917 				}
    918 			}
    919 
    920 
    921                         tif->tif_rawdataoff = 0;
    922                         tif->tif_rawdataloaded = bytecountm;
    923 
    924 			if (!isFillOrder(tif, td->td_fillorder) &&
    925 			    (tif->tif_flags & TIFF_NOBITREV) == 0)
    926 				TIFFReverseBits(tif->tif_rawdata, bytecountm);
    927                 }
    928 	}
    929 	return (TIFFStartStrip(tif, strip));
    930 }
    931 
    932 /*
    933  * Tile-oriented Read Support
    934  * Contributed by Nancy Cam (Silicon Graphics).
    935  */
    936 
    937 /*
    938  * Read and decompress a tile of data.  The
    939  * tile is selected by the (x,y,z,s) coordinates.
    940  */
    941 tmsize_t
    942 TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s)
    943 {
    944 	if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
    945 		return ((tmsize_t)(-1));
    946 	return (TIFFReadEncodedTile(tif,
    947 	    TIFFComputeTile(tif, x, y, z, s), buf, (tmsize_t)(-1)));
    948 }
    949 
    950 /*
    951  * Read a tile of data and decompress the specified
    952  * amount into the user-supplied buffer.
    953  */
    954 tmsize_t
    955 TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size)
    956 {
    957 	static const char module[] = "TIFFReadEncodedTile";
    958 	TIFFDirectory *td = &tif->tif_dir;
    959 	tmsize_t tilesize = tif->tif_tilesize;
    960 
    961 	if (!TIFFCheckRead(tif, 1))
    962 		return ((tmsize_t)(-1));
    963 	if (tile >= td->td_nstrips) {
    964 		TIFFErrorExt(tif->tif_clientdata, module,
    965 		    "%lu: Tile out of range, max %lu",
    966 		    (unsigned long) tile, (unsigned long) td->td_nstrips);
    967 		return ((tmsize_t)(-1));
    968 	}
    969 
    970     /* shortcut to avoid an extra memcpy() */
    971     if( td->td_compression == COMPRESSION_NONE &&
    972         size!=(tmsize_t)(-1) && size >= tilesize &&
    973         !isMapped(tif) &&
    974         ((tif->tif_flags&TIFF_NOREADRAW)==0) )
    975     {
    976         if (TIFFReadRawTile1(tif, tile, buf, tilesize, module) != tilesize)
    977             return ((tmsize_t)(-1));
    978 
    979         if (!isFillOrder(tif, td->td_fillorder) &&
    980             (tif->tif_flags & TIFF_NOBITREV) == 0)
    981             TIFFReverseBits(buf,tilesize);
    982 
    983         (*tif->tif_postdecode)(tif,buf,tilesize);
    984         return (tilesize);
    985     }
    986 
    987 	if (size == (tmsize_t)(-1))
    988 		size = tilesize;
    989 	else if (size > tilesize)
    990 		size = tilesize;
    991 	if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif,
    992 	    (uint8*) buf, size, (uint16)(tile/td->td_stripsperimage))) {
    993 		(*tif->tif_postdecode)(tif, (uint8*) buf, size);
    994 		return (size);
    995 	} else
    996 		return ((tmsize_t)(-1));
    997 }
    998 
    999 /* Variant of TIFFReadTile() that does
   1000  * * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillTile() has
   1001  *   suceeded. This avoid excessive memory allocation in case of truncated
   1002  *   file.
   1003  * * calls regular TIFFReadEncodedTile() if *buf != NULL
   1004  */
   1005 tmsize_t
   1006 _TIFFReadTileAndAllocBuffer(TIFF* tif,
   1007                             void **buf, tmsize_t bufsizetoalloc,
   1008                             uint32 x, uint32 y, uint32 z, uint16 s)
   1009 {
   1010     if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
   1011             return ((tmsize_t)(-1));
   1012     return (_TIFFReadEncodedTileAndAllocBuffer(tif,
   1013                                                TIFFComputeTile(tif, x, y, z, s),
   1014                                                buf, bufsizetoalloc,
   1015                                                (tmsize_t)(-1)));
   1016 }
   1017 
   1018 /* Variant of TIFFReadEncodedTile() that does
   1019  * * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillTile() has
   1020  *   suceeded. This avoid excessive memory allocation in case of truncated
   1021  *   file.
   1022  * * calls regular TIFFReadEncodedTile() if *buf != NULL
   1023  */
   1024 tmsize_t
   1025 _TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
   1026                                     void **buf, tmsize_t bufsizetoalloc,
   1027                                     tmsize_t size_to_read)
   1028 {
   1029     static const char module[] = "_TIFFReadEncodedTileAndAllocBuffer";
   1030     TIFFDirectory *td = &tif->tif_dir;
   1031     tmsize_t tilesize = tif->tif_tilesize;
   1032 
   1033     if( *buf != NULL )
   1034     {
   1035         return TIFFReadEncodedTile(tif, tile, *buf, size_to_read);
   1036     }
   1037 
   1038     if (!TIFFCheckRead(tif, 1))
   1039             return ((tmsize_t)(-1));
   1040     if (tile >= td->td_nstrips) {
   1041             TIFFErrorExt(tif->tif_clientdata, module,
   1042                 "%lu: Tile out of range, max %lu",
   1043                 (unsigned long) tile, (unsigned long) td->td_nstrips);
   1044             return ((tmsize_t)(-1));
   1045     }
   1046 
   1047     if (!TIFFFillTile(tif,tile))
   1048             return((tmsize_t)(-1));
   1049 
   1050     *buf = _TIFFmalloc(bufsizetoalloc);
   1051     if (*buf == NULL) {
   1052             TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif),
   1053                          "No space for tile buffer");
   1054             return((tmsize_t)(-1));
   1055     }
   1056     _TIFFmemset(*buf, 0, bufsizetoalloc);
   1057 
   1058     if (size_to_read == (tmsize_t)(-1))
   1059         size_to_read = tilesize;
   1060     else if (size_to_read > tilesize)
   1061         size_to_read = tilesize;
   1062     if( (*tif->tif_decodetile)(tif,
   1063         (uint8*) *buf, size_to_read, (uint16)(tile/td->td_stripsperimage))) {
   1064         (*tif->tif_postdecode)(tif, (uint8*) *buf, size_to_read);
   1065         return (size_to_read);
   1066     } else
   1067         return ((tmsize_t)(-1));
   1068 }
   1069 
   1070 
   1071 static tmsize_t
   1072 TIFFReadRawTile1(TIFF* tif, uint32 tile, void* buf, tmsize_t size, const char* module)
   1073 {
   1074 	TIFFDirectory *td = &tif->tif_dir;
   1075 
   1076     if (!_TIFFFillStriles( tif ))
   1077         return ((tmsize_t)(-1));
   1078 
   1079 	assert((tif->tif_flags&TIFF_NOREADRAW)==0);
   1080 	if (!isMapped(tif)) {
   1081 		tmsize_t cc;
   1082 
   1083 		if (!SeekOK(tif, td->td_stripoffset[tile])) {
   1084 			TIFFErrorExt(tif->tif_clientdata, module,
   1085 			    "Seek error at row %lu, col %lu, tile %lu",
   1086 			    (unsigned long) tif->tif_row,
   1087 			    (unsigned long) tif->tif_col,
   1088 			    (unsigned long) tile);
   1089 			return ((tmsize_t)(-1));
   1090 		}
   1091 		cc = TIFFReadFile(tif, buf, size);
   1092 		if (cc != size) {
   1093 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
   1094 			TIFFErrorExt(tif->tif_clientdata, module,
   1095 	"Read error at row %lu, col %lu; got %I64u bytes, expected %I64u",
   1096 				     (unsigned long) tif->tif_row,
   1097 				     (unsigned long) tif->tif_col,
   1098 				     (unsigned __int64) cc,
   1099 				     (unsigned __int64) size);
   1100 #else
   1101 			TIFFErrorExt(tif->tif_clientdata, module,
   1102 	"Read error at row %lu, col %lu; got %llu bytes, expected %llu",
   1103 				     (unsigned long) tif->tif_row,
   1104 				     (unsigned long) tif->tif_col,
   1105 				     (unsigned long long) cc,
   1106 				     (unsigned long long) size);
   1107 #endif
   1108 			return ((tmsize_t)(-1));
   1109 		}
   1110 	} else {
   1111 		tmsize_t ma,mb;
   1112 		tmsize_t n;
   1113 		ma=(tmsize_t)td->td_stripoffset[tile];
   1114 		mb=ma+size;
   1115 		if ((td->td_stripoffset[tile] > (uint64)TIFF_TMSIZE_T_MAX)||(ma>tif->tif_size))
   1116 			n=0;
   1117 		else if ((mb<ma)||(mb<size)||(mb>tif->tif_size))
   1118 			n=tif->tif_size-ma;
   1119 		else
   1120 			n=size;
   1121 		if (n!=size) {
   1122 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
   1123 			TIFFErrorExt(tif->tif_clientdata, module,
   1124 "Read error at row %lu, col %lu, tile %lu; got %I64u bytes, expected %I64u",
   1125 				     (unsigned long) tif->tif_row,
   1126 				     (unsigned long) tif->tif_col,
   1127 				     (unsigned long) tile,
   1128 				     (unsigned __int64) n,
   1129 				     (unsigned __int64) size);
   1130 #else
   1131 			TIFFErrorExt(tif->tif_clientdata, module,
   1132 "Read error at row %lu, col %lu, tile %lu; got %llu bytes, expected %llu",
   1133 				     (unsigned long) tif->tif_row,
   1134 				     (unsigned long) tif->tif_col,
   1135 				     (unsigned long) tile,
   1136 				     (unsigned long long) n,
   1137 				     (unsigned long long) size);
   1138 #endif
   1139 			return ((tmsize_t)(-1));
   1140 		}
   1141 		_TIFFmemcpy(buf, tif->tif_base + ma, size);
   1142 	}
   1143 	return (size);
   1144 }
   1145 
   1146 /*
   1147  * Read a tile of data from the file.
   1148  */
   1149 tmsize_t
   1150 TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size)
   1151 {
   1152 	static const char module[] = "TIFFReadRawTile";
   1153 	TIFFDirectory *td = &tif->tif_dir;
   1154 	uint64 bytecount64;
   1155 	tmsize_t bytecountm;
   1156 
   1157 	if (!TIFFCheckRead(tif, 1))
   1158 		return ((tmsize_t)(-1));
   1159 	if (tile >= td->td_nstrips) {
   1160 		TIFFErrorExt(tif->tif_clientdata, module,
   1161 		    "%lu: Tile out of range, max %lu",
   1162 		    (unsigned long) tile, (unsigned long) td->td_nstrips);
   1163 		return ((tmsize_t)(-1));
   1164 	}
   1165 	if (tif->tif_flags&TIFF_NOREADRAW)
   1166 	{
   1167 		TIFFErrorExt(tif->tif_clientdata, module,
   1168 		"Compression scheme does not support access to raw uncompressed data");
   1169 		return ((tmsize_t)(-1));
   1170 	}
   1171 	bytecount64 = td->td_stripbytecount[tile];
   1172 	if (size != (tmsize_t)(-1) && (uint64)size < bytecount64)
   1173 		bytecount64 = (uint64)size;
   1174 	bytecountm = (tmsize_t)bytecount64;
   1175 	if ((uint64)bytecountm!=bytecount64)
   1176 	{
   1177 		TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
   1178 		return ((tmsize_t)(-1));
   1179 	}
   1180 	return (TIFFReadRawTile1(tif, tile, buf, bytecountm, module));
   1181 }
   1182 
   1183 /*
   1184  * Read the specified tile and setup for decoding. The data buffer is
   1185  * expanded, as necessary, to hold the tile's data.
   1186  */
   1187 int
   1188 TIFFFillTile(TIFF* tif, uint32 tile)
   1189 {
   1190 	static const char module[] = "TIFFFillTile";
   1191 	TIFFDirectory *td = &tif->tif_dir;
   1192 
   1193         if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount)
   1194             return 0;
   1195 
   1196 	if ((tif->tif_flags&TIFF_NOREADRAW)==0)
   1197 	{
   1198 		uint64 bytecount = td->td_stripbytecount[tile];
   1199 		if ((int64)bytecount <= 0) {
   1200 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
   1201 			TIFFErrorExt(tif->tif_clientdata, module,
   1202 				"%I64u: Invalid tile byte count, tile %lu",
   1203 				     (unsigned __int64) bytecount,
   1204 				     (unsigned long) tile);
   1205 #else
   1206 			TIFFErrorExt(tif->tif_clientdata, module,
   1207 				"%llu: Invalid tile byte count, tile %lu",
   1208 				     (unsigned long long) bytecount,
   1209 				     (unsigned long) tile);
   1210 #endif
   1211 			return (0);
   1212 		}
   1213 		if (isMapped(tif) &&
   1214 		    (isFillOrder(tif, td->td_fillorder)
   1215 		     || (tif->tif_flags & TIFF_NOBITREV))) {
   1216 			/*
   1217 			 * The image is mapped into memory and we either don't
   1218 			 * need to flip bits or the compression routine is
   1219 			 * going to handle this operation itself.  In this
   1220 			 * case, avoid copying the raw data and instead just
   1221 			 * reference the data from the memory mapped file
   1222 			 * image.  This assumes that the decompression
   1223 			 * routines do not modify the contents of the raw data
   1224 			 * buffer (if they try to, the application will get a
   1225 			 * fault since the file is mapped read-only).
   1226 			 */
   1227 			if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
   1228 				_TIFFfree(tif->tif_rawdata);
   1229 				tif->tif_rawdata = NULL;
   1230 				tif->tif_rawdatasize = 0;
   1231 			}
   1232 			tif->tif_flags &= ~TIFF_MYBUFFER;
   1233 			/*
   1234 			 * We must check for overflow, potentially causing
   1235 			 * an OOB read. Instead of simple
   1236 			 *
   1237 			 *  td->td_stripoffset[tile]+bytecount > tif->tif_size
   1238 			 *
   1239 			 * comparison (which can overflow) we do the following
   1240 			 * two comparisons:
   1241 			 */
   1242 			if (bytecount > (uint64)tif->tif_size ||
   1243 			    td->td_stripoffset[tile] > (uint64)tif->tif_size - bytecount) {
   1244 				tif->tif_curtile = NOTILE;
   1245 				return (0);
   1246 			}
   1247 			tif->tif_rawdatasize = (tmsize_t)bytecount;
   1248 			tif->tif_rawdata =
   1249 				tif->tif_base + (tmsize_t)td->td_stripoffset[tile];
   1250                         tif->tif_rawdataoff = 0;
   1251                         tif->tif_rawdataloaded = (tmsize_t) bytecount;
   1252 			tif->tif_flags |= TIFF_BUFFERMMAP;
   1253 		} else {
   1254 			/*
   1255 			 * Expand raw data buffer, if needed, to hold data
   1256 			 * tile coming from file (perhaps should set upper
   1257 			 * bound on the size of a buffer we'll use?).
   1258 			 */
   1259 			tmsize_t bytecountm;
   1260 			bytecountm=(tmsize_t)bytecount;
   1261 			if ((uint64)bytecountm!=bytecount)
   1262 			{
   1263 				TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
   1264 				return(0);
   1265 			}
   1266 			if (bytecountm > tif->tif_rawdatasize) {
   1267 				tif->tif_curtile = NOTILE;
   1268 				if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
   1269 					TIFFErrorExt(tif->tif_clientdata, module,
   1270 					    "Data buffer too small to hold tile %lu",
   1271 					    (unsigned long) tile);
   1272 					return (0);
   1273 				}
   1274 			}
   1275 			if (tif->tif_flags&TIFF_BUFFERMMAP) {
   1276 				tif->tif_curtile = NOTILE;
   1277 				tif->tif_rawdata = NULL;
   1278 				tif->tif_rawdatasize = 0;
   1279 				tif->tif_flags &= ~TIFF_BUFFERMMAP;
   1280 			}
   1281 
   1282 			if( isMapped(tif) )
   1283 			{
   1284 				if (bytecountm > tif->tif_rawdatasize &&
   1285 				    !TIFFReadBufferSetup(tif, 0, bytecountm))
   1286 				{
   1287 					return (0);
   1288 				}
   1289 				if (TIFFReadRawTile1(tif, tile, tif->tif_rawdata,
   1290 				    bytecountm, module) != bytecountm)
   1291 				{
   1292 					return (0);
   1293 				}
   1294 			}
   1295 			else
   1296 			{
   1297 				if (TIFFReadRawStripOrTile2(tif, tile, 0,
   1298 				    bytecountm, module) != bytecountm)
   1299 				{
   1300 					return (0);
   1301 				}
   1302 			}
   1303 
   1304 
   1305                         tif->tif_rawdataoff = 0;
   1306                         tif->tif_rawdataloaded = bytecountm;
   1307 
   1308 			if (!isFillOrder(tif, td->td_fillorder) &&
   1309 			    (tif->tif_flags & TIFF_NOBITREV) == 0)
   1310 				TIFFReverseBits(tif->tif_rawdata,
   1311                                                 tif->tif_rawdataloaded);
   1312 		}
   1313 	}
   1314 	return (TIFFStartTile(tif, tile));
   1315 }
   1316 
   1317 /*
   1318  * Setup the raw data buffer in preparation for
   1319  * reading a strip of raw data.  If the buffer
   1320  * is specified as zero, then a buffer of appropriate
   1321  * size is allocated by the library.  Otherwise,
   1322  * the client must guarantee that the buffer is
   1323  * large enough to hold any individual strip of
   1324  * raw data.
   1325  */
   1326 int
   1327 TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size)
   1328 {
   1329 	static const char module[] = "TIFFReadBufferSetup";
   1330 
   1331 	assert((tif->tif_flags&TIFF_NOREADRAW)==0);
   1332 	tif->tif_flags &= ~TIFF_BUFFERMMAP;
   1333 
   1334 	if (tif->tif_rawdata) {
   1335 		if (tif->tif_flags & TIFF_MYBUFFER)
   1336 			_TIFFfree(tif->tif_rawdata);
   1337 		tif->tif_rawdata = NULL;
   1338 		tif->tif_rawdatasize = 0;
   1339 	}
   1340 	if (bp) {
   1341 		tif->tif_rawdatasize = size;
   1342 		tif->tif_rawdata = (uint8*) bp;
   1343 		tif->tif_flags &= ~TIFF_MYBUFFER;
   1344 	} else {
   1345 		tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64((uint64)size, 1024);
   1346 		if (tif->tif_rawdatasize==0) {
   1347 		    TIFFErrorExt(tif->tif_clientdata, module,
   1348 				 "Invalid buffer size");
   1349 		    return (0);
   1350 		}
   1351 		/* Initialize to zero to avoid uninitialized buffers in case of */
   1352                 /* short reads (http://bugzilla.maptools.org/show_bug.cgi?id=2651) */
   1353 		tif->tif_rawdata = (uint8*) _TIFFcalloc(1, tif->tif_rawdatasize);
   1354 		tif->tif_flags |= TIFF_MYBUFFER;
   1355 	}
   1356 	if (tif->tif_rawdata == NULL) {
   1357 		TIFFErrorExt(tif->tif_clientdata, module,
   1358 		    "No space for data buffer at scanline %lu",
   1359 		    (unsigned long) tif->tif_row);
   1360 		tif->tif_rawdatasize = 0;
   1361 		return (0);
   1362 	}
   1363 	return (1);
   1364 }
   1365 
   1366 /*
   1367  * Set state to appear as if a
   1368  * strip has just been read in.
   1369  */
   1370 static int
   1371 TIFFStartStrip(TIFF* tif, uint32 strip)
   1372 {
   1373 	TIFFDirectory *td = &tif->tif_dir;
   1374 
   1375         if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount)
   1376             return 0;
   1377 
   1378 	if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
   1379 		if (!(*tif->tif_setupdecode)(tif))
   1380 			return (0);
   1381 		tif->tif_flags |= TIFF_CODERSETUP;
   1382 	}
   1383 	tif->tif_curstrip = strip;
   1384 	tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
   1385         tif->tif_flags &= ~TIFF_BUF4WRITE;
   1386 
   1387 	if (tif->tif_flags&TIFF_NOREADRAW)
   1388 	{
   1389 		tif->tif_rawcp = NULL;
   1390 		tif->tif_rawcc = 0;
   1391 	}
   1392 	else
   1393 	{
   1394 		tif->tif_rawcp = tif->tif_rawdata;
   1395 		if( tif->tif_rawdataloaded > 0 )
   1396 			tif->tif_rawcc = tif->tif_rawdataloaded;
   1397 		else
   1398 			tif->tif_rawcc = (tmsize_t)td->td_stripbytecount[strip];
   1399 	}
   1400 	return ((*tif->tif_predecode)(tif,
   1401 			(uint16)(strip / td->td_stripsperimage)));
   1402 }
   1403 
   1404 /*
   1405  * Set state to appear as if a
   1406  * tile has just been read in.
   1407  */
   1408 static int
   1409 TIFFStartTile(TIFF* tif, uint32 tile)
   1410 {
   1411         static const char module[] = "TIFFStartTile";
   1412 	TIFFDirectory *td = &tif->tif_dir;
   1413         uint32 howmany32;
   1414 
   1415         if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount)
   1416                 return 0;
   1417 
   1418 	if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
   1419 		if (!(*tif->tif_setupdecode)(tif))
   1420 			return (0);
   1421 		tif->tif_flags |= TIFF_CODERSETUP;
   1422 	}
   1423 	tif->tif_curtile = tile;
   1424         howmany32=TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth);
   1425         if (howmany32 == 0) {
   1426                  TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
   1427                 return 0;
   1428         }
   1429 	tif->tif_row = (tile % howmany32) * td->td_tilelength;
   1430         howmany32=TIFFhowmany_32(td->td_imagelength, td->td_tilelength);
   1431         if (howmany32 == 0) {
   1432                 TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
   1433                 return 0;
   1434         }
   1435 	tif->tif_col = (tile % howmany32) * td->td_tilewidth;
   1436         tif->tif_flags &= ~TIFF_BUF4WRITE;
   1437 	if (tif->tif_flags&TIFF_NOREADRAW)
   1438 	{
   1439 		tif->tif_rawcp = NULL;
   1440 		tif->tif_rawcc = 0;
   1441 	}
   1442 	else
   1443 	{
   1444 		tif->tif_rawcp = tif->tif_rawdata;
   1445 		tif->tif_rawcc = (tmsize_t)td->td_stripbytecount[tile];
   1446 	}
   1447 	return ((*tif->tif_predecode)(tif,
   1448 			(uint16)(tile/td->td_stripsperimage)));
   1449 }
   1450 
   1451 static int
   1452 TIFFCheckRead(TIFF* tif, int tiles)
   1453 {
   1454 	if (tif->tif_mode == O_WRONLY) {
   1455 		TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "File not open for reading");
   1456 		return (0);
   1457 	}
   1458 	if (tiles ^ isTiled(tif)) {
   1459 		TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ?
   1460 		    "Can not read tiles from a stripped image" :
   1461 		    "Can not read scanlines from a tiled image");
   1462 		return (0);
   1463 	}
   1464 	return (1);
   1465 }
   1466 
   1467 void
   1468 _TIFFNoPostDecode(TIFF* tif, uint8* buf, tmsize_t cc)
   1469 {
   1470     (void) tif; (void) buf; (void) cc;
   1471 }
   1472 
   1473 void
   1474 _TIFFSwab16BitData(TIFF* tif, uint8* buf, tmsize_t cc)
   1475 {
   1476     (void) tif;
   1477     assert((cc & 1) == 0);
   1478     TIFFSwabArrayOfShort((uint16*) buf, cc/2);
   1479 }
   1480 
   1481 void
   1482 _TIFFSwab24BitData(TIFF* tif, uint8* buf, tmsize_t cc)
   1483 {
   1484     (void) tif;
   1485     assert((cc % 3) == 0);
   1486     TIFFSwabArrayOfTriples((uint8*) buf, cc/3);
   1487 }
   1488 
   1489 void
   1490 _TIFFSwab32BitData(TIFF* tif, uint8* buf, tmsize_t cc)
   1491 {
   1492     (void) tif;
   1493     assert((cc & 3) == 0);
   1494     TIFFSwabArrayOfLong((uint32*) buf, cc/4);
   1495 }
   1496 
   1497 void
   1498 _TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc)
   1499 {
   1500     (void) tif;
   1501     assert((cc & 7) == 0);
   1502     TIFFSwabArrayOfDouble((double*) buf, cc/8);
   1503 }
   1504 
   1505 /* vim: set ts=8 sts=8 sw=8 noet: */
   1506 /*
   1507  * Local Variables:
   1508  * mode: c
   1509  * c-basic-offset: 8
   1510  * fill-column: 78
   1511  * End:
   1512  */
   1513