1 /* $Id: tif_read.c,v 1.45 2015-06-07 22:35:40 bfriesen 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 int TIFFFillStrip(TIFF* tif, uint32 strip); 35 int TIFFFillTile(TIFF* tif, uint32 tile); 36 static int TIFFStartStrip(TIFF* tif, uint32 strip); 37 static int TIFFStartTile(TIFF* tif, uint32 tile); 38 static int TIFFCheckRead(TIFF*, int); 39 static tmsize_t 40 TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size,const char* module); 41 42 #define NOSTRIP ((uint32)(-1)) /* undefined state */ 43 #define NOTILE ((uint32)(-1)) /* undefined state */ 44 45 static int 46 TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) 47 { 48 static const char module[] = "TIFFFillStripPartial"; 49 register TIFFDirectory *td = &tif->tif_dir; 50 tmsize_t unused_data; 51 uint64 read_offset; 52 tmsize_t cc, to_read; 53 /* tmsize_t bytecountm; */ 54 55 if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) 56 return 0; 57 58 /* 59 * Expand raw data buffer, if needed, to hold data 60 * strip coming from file (perhaps should set upper 61 * bound on the size of a buffer we'll use?). 62 */ 63 64 /* bytecountm=(tmsize_t) td->td_stripbytecount[strip]; */ 65 if (read_ahead*2 > tif->tif_rawdatasize) { 66 assert( restart ); 67 68 tif->tif_curstrip = NOSTRIP; 69 if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { 70 TIFFErrorExt(tif->tif_clientdata, module, 71 "Data buffer too small to hold part of strip %lu", 72 (unsigned long) strip); 73 return (0); 74 } 75 if (!TIFFReadBufferSetup(tif, 0, read_ahead*2)) 76 return (0); 77 } 78 79 if( restart ) 80 { 81 tif->tif_rawdataloaded = 0; 82 tif->tif_rawdataoff = 0; 83 } 84 85 /* 86 ** If we are reading more data, move any unused data to the 87 ** start of the buffer. 88 */ 89 if( tif->tif_rawdataloaded > 0 ) 90 unused_data = tif->tif_rawdataloaded - (tif->tif_rawcp - tif->tif_rawdata); 91 else 92 unused_data = 0; 93 94 if( unused_data > 0 ) 95 { 96 assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); 97 memmove( tif->tif_rawdata, tif->tif_rawcp, unused_data ); 98 } 99 100 /* 101 ** Seek to the point in the file where more data should be read. 102 */ 103 read_offset = td->td_stripoffset[strip] 104 + tif->tif_rawdataoff + tif->tif_rawdataloaded; 105 106 if (!SeekOK(tif, read_offset)) { 107 TIFFErrorExt(tif->tif_clientdata, module, 108 "Seek error at scanline %lu, strip %lu", 109 (unsigned long) tif->tif_row, (unsigned long) strip); 110 return 0; 111 } 112 113 /* 114 ** How much do we want to read? 115 */ 116 to_read = tif->tif_rawdatasize - unused_data; 117 if( (uint64) to_read > td->td_stripbytecount[strip] 118 - tif->tif_rawdataoff - tif->tif_rawdataloaded ) 119 { 120 to_read = (tmsize_t) td->td_stripbytecount[strip] 121 - tif->tif_rawdataoff - tif->tif_rawdataloaded; 122 } 123 124 assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); 125 cc = TIFFReadFile(tif, tif->tif_rawdata + unused_data, to_read); 126 127 if (cc != to_read) { 128 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 129 TIFFErrorExt(tif->tif_clientdata, module, 130 "Read error at scanline %lu; got %I64u bytes, expected %I64u", 131 (unsigned long) tif->tif_row, 132 (unsigned __int64) cc, 133 (unsigned __int64) to_read); 134 #else 135 TIFFErrorExt(tif->tif_clientdata, module, 136 "Read error at scanline %lu; got %llu bytes, expected %llu", 137 (unsigned long) tif->tif_row, 138 (unsigned long long) cc, 139 (unsigned long long) to_read); 140 #endif 141 return 0; 142 } 143 144 tif->tif_rawdataoff = tif->tif_rawdataoff + tif->tif_rawdataloaded - unused_data ; 145 tif->tif_rawdataloaded = unused_data + to_read; 146 147 tif->tif_rawcp = tif->tif_rawdata; 148 149 if (!isFillOrder(tif, td->td_fillorder) && 150 (tif->tif_flags & TIFF_NOBITREV) == 0) { 151 assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); 152 TIFFReverseBits(tif->tif_rawdata + unused_data, to_read ); 153 } 154 155 /* 156 ** When starting a strip from the beginning we need to 157 ** restart the decoder. 158 */ 159 if( restart ) 160 return TIFFStartStrip(tif, strip); 161 else 162 return 1; 163 } 164 165 /* 166 * Seek to a random row+sample in a file. 167 * 168 * Only used by TIFFReadScanline, and is only used on 169 * strip organized files. We do some tricky stuff to try 170 * and avoid reading the whole compressed raw data for big 171 * strips. 172 */ 173 static int 174 TIFFSeek(TIFF* tif, uint32 row, uint16 sample ) 175 { 176 register TIFFDirectory *td = &tif->tif_dir; 177 uint32 strip; 178 int whole_strip; 179 tmsize_t read_ahead = 0; 180 181 /* 182 ** Establish what strip we are working from. 183 */ 184 if (row >= td->td_imagelength) { /* out of range */ 185 TIFFErrorExt(tif->tif_clientdata, tif->tif_name, 186 "%lu: Row out of range, max %lu", 187 (unsigned long) row, 188 (unsigned long) td->td_imagelength); 189 return (0); 190 } 191 if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { 192 if (sample >= td->td_samplesperpixel) { 193 TIFFErrorExt(tif->tif_clientdata, tif->tif_name, 194 "%lu: Sample out of range, max %lu", 195 (unsigned long) sample, (unsigned long) td->td_samplesperpixel); 196 return (0); 197 } 198 strip = (uint32)sample*td->td_stripsperimage + row/td->td_rowsperstrip; 199 } else 200 strip = row / td->td_rowsperstrip; 201 202 /* 203 * Do we want to treat this strip as one whole chunk or 204 * read it a few lines at a time? 205 */ 206 #if defined(CHUNKY_STRIP_READ_SUPPORT) 207 if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) 208 return 0; 209 whole_strip = tif->tif_dir.td_stripbytecount[strip] < 10 210 || isMapped(tif); 211 #else 212 whole_strip = 1; 213 #endif 214 215 if( !whole_strip ) 216 { 217 read_ahead = tif->tif_scanlinesize * 16 + 5000; 218 } 219 220 /* 221 * If we haven't loaded this strip, do so now, possibly 222 * only reading the first part. 223 */ 224 if (strip != tif->tif_curstrip) { /* different strip, refill */ 225 226 if( whole_strip ) 227 { 228 if (!TIFFFillStrip(tif, strip)) 229 return (0); 230 } 231 else 232 { 233 if( !TIFFFillStripPartial(tif,strip,read_ahead,1) ) 234 return 0; 235 } 236 } 237 238 /* 239 ** If we already have some data loaded, do we need to read some more? 240 */ 241 else if( !whole_strip ) 242 { 243 if( ((tif->tif_rawdata + tif->tif_rawdataloaded) - tif->tif_rawcp) < read_ahead 244 && (uint64) tif->tif_rawdataoff+tif->tif_rawdataloaded < td->td_stripbytecount[strip] ) 245 { 246 if( !TIFFFillStripPartial(tif,strip,read_ahead,0) ) 247 return 0; 248 } 249 } 250 251 if (row < tif->tif_row) { 252 /* 253 * Moving backwards within the same strip: backup 254 * to the start and then decode forward (below). 255 * 256 * NB: If you're planning on lots of random access within a 257 * strip, it's better to just read and decode the entire 258 * strip, and then access the decoded data in a random fashion. 259 */ 260 261 if( tif->tif_rawdataoff != 0 ) 262 { 263 if( !TIFFFillStripPartial(tif,strip,read_ahead,1) ) 264 return 0; 265 } 266 else 267 { 268 if (!TIFFStartStrip(tif, strip)) 269 return (0); 270 } 271 } 272 273 if (row != tif->tif_row) { 274 /* 275 * Seek forward to the desired row. 276 */ 277 278 /* TODO: Will this really work with partial buffers? */ 279 280 if (!(*tif->tif_seek)(tif, row - tif->tif_row)) 281 return (0); 282 tif->tif_row = row; 283 } 284 285 return (1); 286 } 287 288 int 289 TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample) 290 { 291 int e; 292 293 if (!TIFFCheckRead(tif, 0)) 294 return (-1); 295 if( (e = TIFFSeek(tif, row, sample)) != 0) { 296 /* 297 * Decompress desired row into user buffer. 298 */ 299 e = (*tif->tif_decoderow) 300 (tif, (uint8*) buf, tif->tif_scanlinesize, sample); 301 302 /* we are now poised at the beginning of the next row */ 303 tif->tif_row = row + 1; 304 305 if (e) 306 (*tif->tif_postdecode)(tif, (uint8*) buf, 307 tif->tif_scanlinesize); 308 } 309 return (e > 0 ? 1 : -1); 310 } 311 312 /* 313 * Read a strip of data and decompress the specified 314 * amount into the user-supplied buffer. 315 */ 316 tmsize_t 317 TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size) 318 { 319 static const char module[] = "TIFFReadEncodedStrip"; 320 TIFFDirectory *td = &tif->tif_dir; 321 uint32 rowsperstrip; 322 uint32 stripsperplane; 323 uint32 stripinplane; 324 uint16 plane; 325 uint32 rows; 326 tmsize_t stripsize; 327 if (!TIFFCheckRead(tif,0)) 328 return((tmsize_t)(-1)); 329 if (strip>=td->td_nstrips) 330 { 331 TIFFErrorExt(tif->tif_clientdata,module, 332 "%lu: Strip out of range, max %lu",(unsigned long)strip, 333 (unsigned long)td->td_nstrips); 334 return((tmsize_t)(-1)); 335 } 336 /* 337 * Calculate the strip size according to the number of 338 * rows in the strip (check for truncated last strip on any 339 * of the separations). 340 */ 341 rowsperstrip=td->td_rowsperstrip; 342 if (rowsperstrip>td->td_imagelength) 343 rowsperstrip=td->td_imagelength; 344 stripsperplane=((td->td_imagelength+rowsperstrip-1)/rowsperstrip); 345 stripinplane=(strip%stripsperplane); 346 plane=(strip/stripsperplane); 347 rows=td->td_imagelength-stripinplane*rowsperstrip; 348 if (rows>rowsperstrip) 349 rows=rowsperstrip; 350 stripsize=TIFFVStripSize(tif,rows); 351 if (stripsize==0) 352 return((tmsize_t)(-1)); 353 if ((size!=(tmsize_t)(-1))&&(size<stripsize)) 354 stripsize=size; 355 if (!TIFFFillStrip(tif,strip)) 356 return((tmsize_t)(-1)); 357 if ((*tif->tif_decodestrip)(tif,buf,stripsize,plane)<=0) 358 return((tmsize_t)(-1)); 359 (*tif->tif_postdecode)(tif,buf,stripsize); 360 return(stripsize); 361 } 362 363 static tmsize_t 364 TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size, 365 const char* module) 366 { 367 TIFFDirectory *td = &tif->tif_dir; 368 369 if (!_TIFFFillStriles( tif )) 370 return ((tmsize_t)(-1)); 371 372 assert((tif->tif_flags&TIFF_NOREADRAW)==0); 373 if (!isMapped(tif)) { 374 tmsize_t cc; 375 376 if (!SeekOK(tif, td->td_stripoffset[strip])) { 377 TIFFErrorExt(tif->tif_clientdata, module, 378 "Seek error at scanline %lu, strip %lu", 379 (unsigned long) tif->tif_row, (unsigned long) strip); 380 return ((tmsize_t)(-1)); 381 } 382 cc = TIFFReadFile(tif, buf, size); 383 if (cc != size) { 384 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 385 TIFFErrorExt(tif->tif_clientdata, module, 386 "Read error at scanline %lu; got %I64u bytes, expected %I64u", 387 (unsigned long) tif->tif_row, 388 (unsigned __int64) cc, 389 (unsigned __int64) size); 390 #else 391 TIFFErrorExt(tif->tif_clientdata, module, 392 "Read error at scanline %lu; got %llu bytes, expected %llu", 393 (unsigned long) tif->tif_row, 394 (unsigned long long) cc, 395 (unsigned long long) size); 396 #endif 397 return ((tmsize_t)(-1)); 398 } 399 } else { 400 tmsize_t ma,mb; 401 tmsize_t n; 402 ma=(tmsize_t)td->td_stripoffset[strip]; 403 mb=ma+size; 404 if (((uint64)ma!=td->td_stripoffset[strip])||(ma>tif->tif_size)) 405 n=0; 406 else if ((mb<ma)||(mb<size)||(mb>tif->tif_size)) 407 n=tif->tif_size-ma; 408 else 409 n=size; 410 if (n!=size) { 411 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 412 TIFFErrorExt(tif->tif_clientdata, module, 413 "Read error at scanline %lu, strip %lu; got %I64u bytes, expected %I64u", 414 (unsigned long) tif->tif_row, 415 (unsigned long) strip, 416 (unsigned __int64) n, 417 (unsigned __int64) size); 418 #else 419 TIFFErrorExt(tif->tif_clientdata, module, 420 "Read error at scanline %lu, strip %lu; got %llu bytes, expected %llu", 421 (unsigned long) tif->tif_row, 422 (unsigned long) strip, 423 (unsigned long long) n, 424 (unsigned long long) size); 425 #endif 426 return ((tmsize_t)(-1)); 427 } 428 _TIFFmemcpy(buf, tif->tif_base + ma, 429 size); 430 } 431 return (size); 432 } 433 434 /* 435 * Read a strip of data from the file. 436 */ 437 tmsize_t 438 TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size) 439 { 440 static const char module[] = "TIFFReadRawStrip"; 441 TIFFDirectory *td = &tif->tif_dir; 442 uint64 bytecount; 443 tmsize_t bytecountm; 444 445 if (!TIFFCheckRead(tif, 0)) 446 return ((tmsize_t)(-1)); 447 if (strip >= td->td_nstrips) { 448 TIFFErrorExt(tif->tif_clientdata, module, 449 "%lu: Strip out of range, max %lu", 450 (unsigned long) strip, 451 (unsigned long) td->td_nstrips); 452 return ((tmsize_t)(-1)); 453 } 454 if (tif->tif_flags&TIFF_NOREADRAW) 455 { 456 TIFFErrorExt(tif->tif_clientdata, module, 457 "Compression scheme does not support access to raw uncompressed data"); 458 return ((tmsize_t)(-1)); 459 } 460 bytecount = td->td_stripbytecount[strip]; 461 if ((int64)bytecount <= 0) { 462 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 463 TIFFErrorExt(tif->tif_clientdata, module, 464 "%I64u: Invalid strip byte count, strip %lu", 465 (unsigned __int64) bytecount, 466 (unsigned long) strip); 467 #else 468 TIFFErrorExt(tif->tif_clientdata, module, 469 "%llu: Invalid strip byte count, strip %lu", 470 (unsigned long long) bytecount, 471 (unsigned long) strip); 472 #endif 473 return ((tmsize_t)(-1)); 474 } 475 bytecountm = (tmsize_t)bytecount; 476 if ((uint64)bytecountm!=bytecount) { 477 TIFFErrorExt(tif->tif_clientdata, module, "Integer overflow"); 478 return ((tmsize_t)(-1)); 479 } 480 if (size != (tmsize_t)(-1) && size < bytecountm) 481 bytecountm = size; 482 return (TIFFReadRawStrip1(tif, strip, buf, bytecountm, module)); 483 } 484 485 /* 486 * Read the specified strip and setup for decoding. The data buffer is 487 * expanded, as necessary, to hold the strip's data. 488 */ 489 int 490 TIFFFillStrip(TIFF* tif, uint32 strip) 491 { 492 static const char module[] = "TIFFFillStrip"; 493 TIFFDirectory *td = &tif->tif_dir; 494 495 if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) 496 return 0; 497 498 if ((tif->tif_flags&TIFF_NOREADRAW)==0) 499 { 500 uint64 bytecount = td->td_stripbytecount[strip]; 501 if ((int64)bytecount <= 0) { 502 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 503 TIFFErrorExt(tif->tif_clientdata, module, 504 "Invalid strip byte count %I64u, strip %lu", 505 (unsigned __int64) bytecount, 506 (unsigned long) strip); 507 #else 508 TIFFErrorExt(tif->tif_clientdata, module, 509 "Invalid strip byte count %llu, strip %lu", 510 (unsigned long long) bytecount, 511 (unsigned long) strip); 512 #endif 513 return (0); 514 } 515 if (isMapped(tif) && 516 (isFillOrder(tif, td->td_fillorder) 517 || (tif->tif_flags & TIFF_NOBITREV))) { 518 /* 519 * The image is mapped into memory and we either don't 520 * need to flip bits or the compression routine is 521 * going to handle this operation itself. In this 522 * case, avoid copying the raw data and instead just 523 * reference the data from the memory mapped file 524 * image. This assumes that the decompression 525 * routines do not modify the contents of the raw data 526 * buffer (if they try to, the application will get a 527 * fault since the file is mapped read-only). 528 */ 529 if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { 530 _TIFFfree(tif->tif_rawdata); 531 tif->tif_rawdata = NULL; 532 tif->tif_rawdatasize = 0; 533 } 534 tif->tif_flags &= ~TIFF_MYBUFFER; 535 /* 536 * We must check for overflow, potentially causing 537 * an OOB read. Instead of simple 538 * 539 * td->td_stripoffset[strip]+bytecount > tif->tif_size 540 * 541 * comparison (which can overflow) we do the following 542 * two comparisons: 543 */ 544 if (bytecount > (uint64)tif->tif_size || 545 td->td_stripoffset[strip] > (uint64)tif->tif_size - bytecount) { 546 /* 547 * This error message might seem strange, but 548 * it's what would happen if a read were done 549 * instead. 550 */ 551 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 552 TIFFErrorExt(tif->tif_clientdata, module, 553 554 "Read error on strip %lu; " 555 "got %I64u bytes, expected %I64u", 556 (unsigned long) strip, 557 (unsigned __int64) tif->tif_size - td->td_stripoffset[strip], 558 (unsigned __int64) bytecount); 559 #else 560 TIFFErrorExt(tif->tif_clientdata, module, 561 562 "Read error on strip %lu; " 563 "got %llu bytes, expected %llu", 564 (unsigned long) strip, 565 (unsigned long long) tif->tif_size - td->td_stripoffset[strip], 566 (unsigned long long) bytecount); 567 #endif 568 tif->tif_curstrip = NOSTRIP; 569 return (0); 570 } 571 tif->tif_rawdatasize = (tmsize_t)bytecount; 572 tif->tif_rawdata = tif->tif_base + (tmsize_t)td->td_stripoffset[strip]; 573 tif->tif_rawdataoff = 0; 574 tif->tif_rawdataloaded = (tmsize_t) bytecount; 575 576 /* 577 * When we have tif_rawdata reference directly into the memory mapped file 578 * we need to be pretty careful about how we use the rawdata. It is not 579 * a general purpose working buffer as it normally otherwise is. So we 580 * keep track of this fact to avoid using it improperly. 581 */ 582 tif->tif_flags |= TIFF_BUFFERMMAP; 583 } else { 584 /* 585 * Expand raw data buffer, if needed, to hold data 586 * strip coming from file (perhaps should set upper 587 * bound on the size of a buffer we'll use?). 588 */ 589 tmsize_t bytecountm; 590 bytecountm=(tmsize_t)bytecount; 591 if ((uint64)bytecountm!=bytecount) 592 { 593 TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); 594 return(0); 595 } 596 if (bytecountm > tif->tif_rawdatasize) { 597 tif->tif_curstrip = NOSTRIP; 598 if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { 599 TIFFErrorExt(tif->tif_clientdata, module, 600 "Data buffer too small to hold strip %lu", 601 (unsigned long) strip); 602 return (0); 603 } 604 if (!TIFFReadBufferSetup(tif, 0, bytecountm)) 605 return (0); 606 } 607 if (tif->tif_flags&TIFF_BUFFERMMAP) { 608 tif->tif_curstrip = NOSTRIP; 609 if (!TIFFReadBufferSetup(tif, 0, bytecountm)) 610 return (0); 611 } 612 if (TIFFReadRawStrip1(tif, strip, tif->tif_rawdata, 613 bytecountm, module) != bytecountm) 614 return (0); 615 616 tif->tif_rawdataoff = 0; 617 tif->tif_rawdataloaded = bytecountm; 618 619 if (!isFillOrder(tif, td->td_fillorder) && 620 (tif->tif_flags & TIFF_NOBITREV) == 0) 621 TIFFReverseBits(tif->tif_rawdata, bytecountm); 622 } 623 } 624 return (TIFFStartStrip(tif, strip)); 625 } 626 627 /* 628 * Tile-oriented Read Support 629 * Contributed by Nancy Cam (Silicon Graphics). 630 */ 631 632 /* 633 * Read and decompress a tile of data. The 634 * tile is selected by the (x,y,z,s) coordinates. 635 */ 636 tmsize_t 637 TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s) 638 { 639 if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s)) 640 return ((tmsize_t)(-1)); 641 return (TIFFReadEncodedTile(tif, 642 TIFFComputeTile(tif, x, y, z, s), buf, (tmsize_t)(-1))); 643 } 644 645 /* 646 * Read a tile of data and decompress the specified 647 * amount into the user-supplied buffer. 648 */ 649 tmsize_t 650 TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size) 651 { 652 static const char module[] = "TIFFReadEncodedTile"; 653 TIFFDirectory *td = &tif->tif_dir; 654 tmsize_t tilesize = tif->tif_tilesize; 655 656 if (!TIFFCheckRead(tif, 1)) 657 return ((tmsize_t)(-1)); 658 if (tile >= td->td_nstrips) { 659 TIFFErrorExt(tif->tif_clientdata, module, 660 "%lu: Tile out of range, max %lu", 661 (unsigned long) tile, (unsigned long) td->td_nstrips); 662 return ((tmsize_t)(-1)); 663 } 664 if (size == (tmsize_t)(-1)) 665 size = tilesize; 666 else if (size > tilesize) 667 size = tilesize; 668 if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif, 669 (uint8*) buf, size, (uint16)(tile/td->td_stripsperimage))) { 670 (*tif->tif_postdecode)(tif, (uint8*) buf, size); 671 return (size); 672 } else 673 return ((tmsize_t)(-1)); 674 } 675 676 static tmsize_t 677 TIFFReadRawTile1(TIFF* tif, uint32 tile, void* buf, tmsize_t size, const char* module) 678 { 679 TIFFDirectory *td = &tif->tif_dir; 680 681 if (!_TIFFFillStriles( tif )) 682 return ((tmsize_t)(-1)); 683 684 assert((tif->tif_flags&TIFF_NOREADRAW)==0); 685 if (!isMapped(tif)) { 686 tmsize_t cc; 687 688 if (!SeekOK(tif, td->td_stripoffset[tile])) { 689 TIFFErrorExt(tif->tif_clientdata, module, 690 "Seek error at row %lu, col %lu, tile %lu", 691 (unsigned long) tif->tif_row, 692 (unsigned long) tif->tif_col, 693 (unsigned long) tile); 694 return ((tmsize_t)(-1)); 695 } 696 cc = TIFFReadFile(tif, buf, size); 697 if (cc != size) { 698 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 699 TIFFErrorExt(tif->tif_clientdata, module, 700 "Read error at row %lu, col %lu; got %I64u bytes, expected %I64u", 701 (unsigned long) tif->tif_row, 702 (unsigned long) tif->tif_col, 703 (unsigned __int64) cc, 704 (unsigned __int64) size); 705 #else 706 TIFFErrorExt(tif->tif_clientdata, module, 707 "Read error at row %lu, col %lu; got %llu bytes, expected %llu", 708 (unsigned long) tif->tif_row, 709 (unsigned long) tif->tif_col, 710 (unsigned long long) cc, 711 (unsigned long long) size); 712 #endif 713 return ((tmsize_t)(-1)); 714 } 715 } else { 716 tmsize_t ma,mb; 717 tmsize_t n; 718 ma=(tmsize_t)td->td_stripoffset[tile]; 719 mb=ma+size; 720 if (((uint64)ma!=td->td_stripoffset[tile])||(ma>tif->tif_size)) 721 n=0; 722 else if ((mb<ma)||(mb<size)||(mb>tif->tif_size)) 723 n=tif->tif_size-ma; 724 else 725 n=size; 726 if (n!=size) { 727 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 728 TIFFErrorExt(tif->tif_clientdata, module, 729 "Read error at row %lu, col %lu, tile %lu; got %I64u bytes, expected %I64u", 730 (unsigned long) tif->tif_row, 731 (unsigned long) tif->tif_col, 732 (unsigned long) tile, 733 (unsigned __int64) n, 734 (unsigned __int64) size); 735 #else 736 TIFFErrorExt(tif->tif_clientdata, module, 737 "Read error at row %lu, col %lu, tile %lu; got %llu bytes, expected %llu", 738 (unsigned long) tif->tif_row, 739 (unsigned long) tif->tif_col, 740 (unsigned long) tile, 741 (unsigned long long) n, 742 (unsigned long long) size); 743 #endif 744 return ((tmsize_t)(-1)); 745 } 746 _TIFFmemcpy(buf, tif->tif_base + ma, size); 747 } 748 return (size); 749 } 750 751 /* 752 * Read a tile of data from the file. 753 */ 754 tmsize_t 755 TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size) 756 { 757 static const char module[] = "TIFFReadRawTile"; 758 TIFFDirectory *td = &tif->tif_dir; 759 uint64 bytecount64; 760 tmsize_t bytecountm; 761 762 if (!TIFFCheckRead(tif, 1)) 763 return ((tmsize_t)(-1)); 764 if (tile >= td->td_nstrips) { 765 TIFFErrorExt(tif->tif_clientdata, module, 766 "%lu: Tile out of range, max %lu", 767 (unsigned long) tile, (unsigned long) td->td_nstrips); 768 return ((tmsize_t)(-1)); 769 } 770 if (tif->tif_flags&TIFF_NOREADRAW) 771 { 772 TIFFErrorExt(tif->tif_clientdata, module, 773 "Compression scheme does not support access to raw uncompressed data"); 774 return ((tmsize_t)(-1)); 775 } 776 bytecount64 = td->td_stripbytecount[tile]; 777 if (size != (tmsize_t)(-1) && (uint64)size < bytecount64) 778 bytecount64 = (uint64)size; 779 bytecountm = (tmsize_t)bytecount64; 780 if ((uint64)bytecountm!=bytecount64) 781 { 782 TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); 783 return ((tmsize_t)(-1)); 784 } 785 return (TIFFReadRawTile1(tif, tile, buf, bytecountm, module)); 786 } 787 788 /* 789 * Read the specified tile and setup for decoding. The data buffer is 790 * expanded, as necessary, to hold the tile's data. 791 */ 792 int 793 TIFFFillTile(TIFF* tif, uint32 tile) 794 { 795 static const char module[] = "TIFFFillTile"; 796 TIFFDirectory *td = &tif->tif_dir; 797 798 if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) 799 return 0; 800 801 if ((tif->tif_flags&TIFF_NOREADRAW)==0) 802 { 803 uint64 bytecount = td->td_stripbytecount[tile]; 804 if ((int64)bytecount <= 0) { 805 #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) 806 TIFFErrorExt(tif->tif_clientdata, module, 807 "%I64u: Invalid tile byte count, tile %lu", 808 (unsigned __int64) bytecount, 809 (unsigned long) tile); 810 #else 811 TIFFErrorExt(tif->tif_clientdata, module, 812 "%llu: Invalid tile byte count, tile %lu", 813 (unsigned long long) bytecount, 814 (unsigned long) tile); 815 #endif 816 return (0); 817 } 818 if (isMapped(tif) && 819 (isFillOrder(tif, td->td_fillorder) 820 || (tif->tif_flags & TIFF_NOBITREV))) { 821 /* 822 * The image is mapped into memory and we either don't 823 * need to flip bits or the compression routine is 824 * going to handle this operation itself. In this 825 * case, avoid copying the raw data and instead just 826 * reference the data from the memory mapped file 827 * image. This assumes that the decompression 828 * routines do not modify the contents of the raw data 829 * buffer (if they try to, the application will get a 830 * fault since the file is mapped read-only). 831 */ 832 if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { 833 _TIFFfree(tif->tif_rawdata); 834 tif->tif_rawdata = NULL; 835 tif->tif_rawdatasize = 0; 836 } 837 tif->tif_flags &= ~TIFF_MYBUFFER; 838 /* 839 * We must check for overflow, potentially causing 840 * an OOB read. Instead of simple 841 * 842 * td->td_stripoffset[tile]+bytecount > tif->tif_size 843 * 844 * comparison (which can overflow) we do the following 845 * two comparisons: 846 */ 847 if (bytecount > (uint64)tif->tif_size || 848 td->td_stripoffset[tile] > (uint64)tif->tif_size - bytecount) { 849 tif->tif_curtile = NOTILE; 850 return (0); 851 } 852 tif->tif_rawdatasize = (tmsize_t)bytecount; 853 tif->tif_rawdata = 854 tif->tif_base + (tmsize_t)td->td_stripoffset[tile]; 855 tif->tif_rawdataoff = 0; 856 tif->tif_rawdataloaded = (tmsize_t) bytecount; 857 tif->tif_flags |= TIFF_BUFFERMMAP; 858 } else { 859 /* 860 * Expand raw data buffer, if needed, to hold data 861 * tile coming from file (perhaps should set upper 862 * bound on the size of a buffer we'll use?). 863 */ 864 tmsize_t bytecountm; 865 bytecountm=(tmsize_t)bytecount; 866 if ((uint64)bytecountm!=bytecount) 867 { 868 TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow"); 869 return(0); 870 } 871 if (bytecountm > tif->tif_rawdatasize) { 872 tif->tif_curtile = NOTILE; 873 if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { 874 TIFFErrorExt(tif->tif_clientdata, module, 875 "Data buffer too small to hold tile %lu", 876 (unsigned long) tile); 877 return (0); 878 } 879 if (!TIFFReadBufferSetup(tif, 0, bytecountm)) 880 return (0); 881 } 882 if (tif->tif_flags&TIFF_BUFFERMMAP) { 883 tif->tif_curtile = NOTILE; 884 if (!TIFFReadBufferSetup(tif, 0, bytecountm)) 885 return (0); 886 } 887 888 if (TIFFReadRawTile1(tif, tile, tif->tif_rawdata, 889 bytecountm, module) != bytecountm) 890 return (0); 891 892 tif->tif_rawdataoff = 0; 893 tif->tif_rawdataloaded = bytecountm; 894 895 if (!isFillOrder(tif, td->td_fillorder) && 896 (tif->tif_flags & TIFF_NOBITREV) == 0) 897 TIFFReverseBits(tif->tif_rawdata, 898 tif->tif_rawdataloaded); 899 } 900 } 901 return (TIFFStartTile(tif, tile)); 902 } 903 904 /* 905 * Setup the raw data buffer in preparation for 906 * reading a strip of raw data. If the buffer 907 * is specified as zero, then a buffer of appropriate 908 * size is allocated by the library. Otherwise, 909 * the client must guarantee that the buffer is 910 * large enough to hold any individual strip of 911 * raw data. 912 */ 913 int 914 TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size) 915 { 916 static const char module[] = "TIFFReadBufferSetup"; 917 918 assert((tif->tif_flags&TIFF_NOREADRAW)==0); 919 tif->tif_flags &= ~TIFF_BUFFERMMAP; 920 921 if (tif->tif_rawdata) { 922 if (tif->tif_flags & TIFF_MYBUFFER) 923 _TIFFfree(tif->tif_rawdata); 924 tif->tif_rawdata = NULL; 925 tif->tif_rawdatasize = 0; 926 } 927 if (bp) { 928 tif->tif_rawdatasize = size; 929 tif->tif_rawdata = (uint8*) bp; 930 tif->tif_flags &= ~TIFF_MYBUFFER; 931 } else { 932 tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64((uint64)size, 1024); 933 if (tif->tif_rawdatasize==0) { 934 TIFFErrorExt(tif->tif_clientdata, module, 935 "Invalid buffer size"); 936 return (0); 937 } 938 tif->tif_rawdata = (uint8*) _TIFFmalloc(tif->tif_rawdatasize); 939 if (tif->tif_rawdata) 940 memset(tif->tif_rawdata, 0, tif->tif_rawdatasize); 941 942 tif->tif_flags |= TIFF_MYBUFFER; 943 } 944 if (tif->tif_rawdata == NULL) { 945 TIFFErrorExt(tif->tif_clientdata, module, 946 "No space for data buffer at scanline %lu", 947 (unsigned long) tif->tif_row); 948 tif->tif_rawdatasize = 0; 949 return (0); 950 } 951 return (1); 952 } 953 954 /* 955 * Set state to appear as if a 956 * strip has just been read in. 957 */ 958 static int 959 TIFFStartStrip(TIFF* tif, uint32 strip) 960 { 961 TIFFDirectory *td = &tif->tif_dir; 962 963 if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) 964 return 0; 965 966 if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { 967 if (!(*tif->tif_setupdecode)(tif)) 968 return (0); 969 tif->tif_flags |= TIFF_CODERSETUP; 970 } 971 tif->tif_curstrip = strip; 972 tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; 973 tif->tif_flags &= ~TIFF_BUF4WRITE; 974 975 if (tif->tif_flags&TIFF_NOREADRAW) 976 { 977 tif->tif_rawcp = NULL; 978 tif->tif_rawcc = 0; 979 } 980 else 981 { 982 tif->tif_rawcp = tif->tif_rawdata; 983 tif->tif_rawcc = (tmsize_t)td->td_stripbytecount[strip]; 984 } 985 return ((*tif->tif_predecode)(tif, 986 (uint16)(strip / td->td_stripsperimage))); 987 } 988 989 /* 990 * Set state to appear as if a 991 * tile has just been read in. 992 */ 993 static int 994 TIFFStartTile(TIFF* tif, uint32 tile) 995 { 996 static const char module[] = "TIFFStartTile"; 997 TIFFDirectory *td = &tif->tif_dir; 998 uint32 howmany32; 999 1000 if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) 1001 return 0; 1002 1003 if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { 1004 if (!(*tif->tif_setupdecode)(tif)) 1005 return (0); 1006 tif->tif_flags |= TIFF_CODERSETUP; 1007 } 1008 tif->tif_curtile = tile; 1009 howmany32=TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth); 1010 if (howmany32 == 0) { 1011 TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles"); 1012 return 0; 1013 } 1014 tif->tif_row = (tile % howmany32) * td->td_tilelength; 1015 howmany32=TIFFhowmany_32(td->td_imagelength, td->td_tilelength); 1016 if (howmany32 == 0) { 1017 TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles"); 1018 return 0; 1019 } 1020 tif->tif_col = (tile % howmany32) * td->td_tilewidth; 1021 tif->tif_flags &= ~TIFF_BUF4WRITE; 1022 if (tif->tif_flags&TIFF_NOREADRAW) 1023 { 1024 tif->tif_rawcp = NULL; 1025 tif->tif_rawcc = 0; 1026 } 1027 else 1028 { 1029 tif->tif_rawcp = tif->tif_rawdata; 1030 tif->tif_rawcc = (tmsize_t)td->td_stripbytecount[tile]; 1031 } 1032 return ((*tif->tif_predecode)(tif, 1033 (uint16)(tile/td->td_stripsperimage))); 1034 } 1035 1036 static int 1037 TIFFCheckRead(TIFF* tif, int tiles) 1038 { 1039 if (tif->tif_mode == O_WRONLY) { 1040 TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "File not open for reading"); 1041 return (0); 1042 } 1043 if (tiles ^ isTiled(tif)) { 1044 TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ? 1045 "Can not read tiles from a stripped image" : 1046 "Can not read scanlines from a tiled image"); 1047 return (0); 1048 } 1049 return (1); 1050 } 1051 1052 void 1053 _TIFFNoPostDecode(TIFF* tif, uint8* buf, tmsize_t cc) 1054 { 1055 (void) tif; (void) buf; (void) cc; 1056 } 1057 1058 void 1059 _TIFFSwab16BitData(TIFF* tif, uint8* buf, tmsize_t cc) 1060 { 1061 (void) tif; 1062 assert((cc & 1) == 0); 1063 TIFFSwabArrayOfShort((uint16*) buf, cc/2); 1064 } 1065 1066 void 1067 _TIFFSwab24BitData(TIFF* tif, uint8* buf, tmsize_t cc) 1068 { 1069 (void) tif; 1070 assert((cc % 3) == 0); 1071 TIFFSwabArrayOfTriples((uint8*) buf, cc/3); 1072 } 1073 1074 void 1075 _TIFFSwab32BitData(TIFF* tif, uint8* buf, tmsize_t cc) 1076 { 1077 (void) tif; 1078 assert((cc & 3) == 0); 1079 TIFFSwabArrayOfLong((uint32*) buf, cc/4); 1080 } 1081 1082 void 1083 _TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc) 1084 { 1085 (void) tif; 1086 assert((cc & 7) == 0); 1087 TIFFSwabArrayOfDouble((double*) buf, cc/8); 1088 } 1089 1090 /* vim: set ts=8 sts=8 sw=8 noet: */ 1091 /* 1092 * Local Variables: 1093 * mode: c 1094 * c-basic-offset: 8 1095 * fill-column: 78 1096 * End: 1097 */ 1098