AWARE SYSTEMS
TIFF and LibTiff Mail List Archive

2013.05.29 18:20 "[Tiff] LibTiff Bug in ChopUpSingleUncompressedStrip", by LaViolette, Alan

I have found an issue in ChopUpSingleUncompressedStrip() located in tif_dirread.c. This function attempts to split up a large single strip image into multiple strips. I believe the issue I am having is it does not reset/change the td->td_stripbufmax value to represent the new size of the size and offset blocks. This causes the code in _TIFFGetByteCount() and _TIFFGetOffset() to incorrectly compute the correct block number (it should now always be 0), It will only work for images with < td_stripbufmax strips, in my case 1024.

Code in _TIFFGetByteCount():

extern uint32
_TIFFGetByteCount(TIFF* tif, tstrip_t strip)
{

      TIFFDirectory *td = &tif->tif_dir;
      int   status = 1;

      uint32      blkno = strip / td->td_stripbufmax;  // Value is not set correctly
      uint32      tdi;

...

Code as it needs to be in ChopUpSingleUncompressedStrip():

td->td_stripbcsbuf = newcounts;
td->td_stripoffsbuf = newoffsets;
td->td_stripbcsblk = 0;
td->td_stripoffsblk = 0;
td->td_stripbytecountsorted = 1;

      td->td_stripbufmax = nstrips;             // New assignment to td_stripbufmax

I have tested this change in my own code base and it is working correctly, but I don't know if it will have any other effects. Also other td_strip* values are not adjusted in ChopUpSingleUncompressedStrip(), is that Ok.

Thanks,
Alan L.