LCOV - code coverage report
Current view: top level - frmts/gtiff/libtiff - tif_lzw.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 497 591 84.1 %
Date: 2025-01-18 12:42:00 Functions: 18 19 94.7 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 1988-1997 Sam Leffler
       3             :  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
       4             :  * Copyright (c) 2022 Even Rouault
       5             :  *
       6             :  * Permission to use, copy, modify, distribute, and sell this software and
       7             :  * its documentation for any purpose is hereby granted without fee, provided
       8             :  * that (i) the above copyright notices and this permission notice appear in
       9             :  * all copies of the software and related documentation, and (ii) the names of
      10             :  * Sam Leffler and Silicon Graphics may not be used in any advertising or
      11             :  * publicity relating to the software without the specific, prior written
      12             :  * permission of Sam Leffler and Silicon Graphics.
      13             :  *
      14             :  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
      15             :  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
      16             :  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
      17             :  *
      18             :  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
      19             :  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
      20             :  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      21             :  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
      22             :  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
      23             :  * OF THIS SOFTWARE.
      24             :  */
      25             : 
      26             : #include "tiffiop.h"
      27             : #ifdef LZW_SUPPORT
      28             : /*
      29             :  * TIFF Library.
      30             :  * Rev 5.0 Lempel-Ziv & Welch Compression Support
      31             :  *
      32             :  * This code is derived from the compress program whose code is
      33             :  * derived from software contributed to Berkeley by James A. Woods,
      34             :  * derived from original work by Spencer Thomas and Joseph Orost.
      35             :  *
      36             :  * The original Berkeley copyright notice appears below in its entirety.
      37             :  */
      38             : #include "tif_predict.h"
      39             : 
      40             : #include <stdbool.h>
      41             : #include <stdio.h>
      42             : #include <stdlib.h>
      43             : 
      44             : /* Select the plausible largest natural integer type for the architecture */
      45             : #define SIZEOF_WORDTYPE SIZEOF_SIZE_T
      46             : typedef size_t WordType;
      47             : 
      48             : /*
      49             :  * NB: The 5.0 spec describes a different algorithm than Aldus
      50             :  *     implements.  Specifically, Aldus does code length transitions
      51             :  *     one code earlier than should be done (for real LZW).
      52             :  *     Earlier versions of this library implemented the correct
      53             :  *     LZW algorithm, but emitted codes in a bit order opposite
      54             :  *     to the TIFF spec.  Thus, to maintain compatibility w/ Aldus
      55             :  *     we interpret MSB-LSB ordered codes to be images written w/
      56             :  *     old versions of this library, but otherwise adhere to the
      57             :  *     Aldus "off by one" algorithm.
      58             :  *
      59             :  * Future revisions to the TIFF spec are expected to "clarify this issue".
      60             :  */
      61             : #define LZW_COMPAT /* include backwards compatibility code */
      62             : 
      63             : #define MAXCODE(n) ((1L << (n)) - 1)
      64             : /*
      65             :  * The TIFF spec specifies that encoded bit
      66             :  * strings range from 9 to 12 bits.
      67             :  */
      68             : #define BITS_MIN 9  /* start with 9 bits */
      69             : #define BITS_MAX 12 /* max of 12 bit strings */
      70             : /* predefined codes */
      71             : #define CODE_CLEAR 256 /* code to clear string table */
      72             : #define CODE_EOI 257   /* end-of-information code */
      73             : #define CODE_FIRST 258 /* first free code entry */
      74             : #define CODE_MAX MAXCODE(BITS_MAX)
      75             : #define HSIZE 9001L /* 91% occupancy */
      76             : #define HSHIFT (13 - 8)
      77             : #ifdef LZW_COMPAT
      78             : /* NB: +1024 is for compatibility with old files */
      79             : #define CSIZE (MAXCODE(BITS_MAX) + 1024L)
      80             : #else
      81             : #define CSIZE (MAXCODE(BITS_MAX) + 1L)
      82             : #endif
      83             : 
      84             : /*
      85             :  * State block for each open TIFF file using LZW
      86             :  * compression/decompression.  Note that the predictor
      87             :  * state block must be first in this data structure.
      88             :  */
      89             : typedef struct
      90             : {
      91             :     TIFFPredictorState predict; /* predictor super class */
      92             : 
      93             :     unsigned short nbits;    /* # of bits/code */
      94             :     unsigned short maxcode;  /* maximum code for lzw_nbits */
      95             :     unsigned short free_ent; /* next free entry in hash table */
      96             :     WordType nextdata;       /* next bits of i/o */
      97             :     long nextbits;           /* # of valid bits in lzw_nextdata */
      98             : 
      99             :     int rw_mode; /* preserve rw_mode from init */
     100             : } LZWBaseState;
     101             : 
     102             : #define lzw_nbits base.nbits
     103             : #define lzw_maxcode base.maxcode
     104             : #define lzw_free_ent base.free_ent
     105             : #define lzw_nextdata base.nextdata
     106             : #define lzw_nextbits base.nextbits
     107             : 
     108             : /*
     109             :  * Encoding-specific state.
     110             :  */
     111             : typedef uint16_t hcode_t; /* codes fit in 16 bits */
     112             : typedef struct
     113             : {
     114             :     long hash;
     115             :     hcode_t code;
     116             : } hash_t;
     117             : 
     118             : /*
     119             :  * Decoding-specific state.
     120             :  */
     121             : typedef struct code_ent
     122             : {
     123             :     struct code_ent *next;
     124             :     unsigned short length; /* string len, including this token */
     125             :     /* firstchar should be placed immediately before value in this structure */
     126             :     unsigned char firstchar; /* first token of string */
     127             :     unsigned char value;     /* data value */
     128             :     bool repeated;
     129             : } code_t;
     130             : 
     131             : typedef int (*decodeFunc)(TIFF *, uint8_t *, tmsize_t, uint16_t);
     132             : 
     133             : typedef struct
     134             : {
     135             :     LZWBaseState base;
     136             : 
     137             :     /* Decoding specific data */
     138             :     long dec_nbitsmask;     /* lzw_nbits 1 bits, right adjusted */
     139             :     tmsize_t dec_restart;   /* restart count */
     140             :     uint64_t dec_bitsleft;  /* available bits in raw data */
     141             :     tmsize_t old_tif_rawcc; /* value of tif_rawcc at the end of the previous
     142             :                                TIFLZWDecode() call */
     143             :     decodeFunc dec_decode;  /* regular or backwards compatible */
     144             :     code_t *dec_codep;      /* current recognized code */
     145             :     code_t *dec_oldcodep;   /* previously recognized code */
     146             :     code_t *dec_free_entp;  /* next free entry */
     147             :     code_t *dec_maxcodep;   /* max available entry */
     148             :     code_t *dec_codetab;    /* kept separate for small machines */
     149             :     int read_error; /* whether a read error has occurred, and which should cause
     150             :                        further reads in the same strip/tile to be aborted */
     151             : 
     152             :     /* Encoding specific data */
     153             :     int enc_oldcode;         /* last code encountered */
     154             :     tmsize_t enc_checkpoint; /* point at which to clear table */
     155             : #define CHECK_GAP 10000      /* enc_ratio check interval */
     156             :     tmsize_t enc_ratio;      /* current compression ratio */
     157             :     tmsize_t enc_incount;    /* (input) data bytes encoded */
     158             :     tmsize_t enc_outcount;   /* encoded (output) bytes */
     159             :     uint8_t *enc_rawlimit;   /* bound on tif_rawdata buffer */
     160             :     hash_t *enc_hashtab;     /* kept separate for small machines */
     161             : } LZWCodecState;
     162             : 
     163             : #define LZWState(tif) ((LZWBaseState *)(tif)->tif_data)
     164             : #define LZWDecoderState(tif) ((LZWCodecState *)LZWState(tif))
     165             : #define LZWEncoderState(tif) ((LZWCodecState *)LZWState(tif))
     166             : 
     167             : static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
     168             : #ifdef LZW_COMPAT
     169             : static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
     170             : #endif
     171             : 
     172             : /*
     173             :  * LZW Decoder.
     174             :  */
     175             : 
     176        4189 : static int LZWFixupTags(TIFF *tif)
     177             : {
     178             :     (void)tif;
     179        4189 :     return (1);
     180             : }
     181             : 
     182        2478 : static int LZWSetupDecode(TIFF *tif)
     183             : {
     184             :     static const char module[] = "LZWSetupDecode";
     185        2478 :     LZWCodecState *sp = LZWDecoderState(tif);
     186             :     int code;
     187             : 
     188        2478 :     if (sp == NULL)
     189             :     {
     190             :         /*
     191             :          * Allocate state block so tag methods have storage to record
     192             :          * values.
     193             :          */
     194           0 :         tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
     195           0 :         if (tif->tif_data == NULL)
     196             :         {
     197           0 :             TIFFErrorExtR(tif, module, "No space for LZW state block");
     198           0 :             return (0);
     199             :         }
     200             : 
     201           0 :         sp = LZWDecoderState(tif);
     202           0 :         sp->dec_codetab = NULL;
     203           0 :         sp->dec_decode = NULL;
     204             : 
     205             :         /*
     206             :          * Setup predictor setup.
     207             :          */
     208           0 :         (void)TIFFPredictorInit(tif);
     209             :     }
     210             : 
     211        2477 :     if (sp->dec_codetab == NULL)
     212             :     {
     213        2473 :         sp->dec_codetab = (code_t *)_TIFFmallocExt(tif, CSIZE * sizeof(code_t));
     214        2474 :         if (sp->dec_codetab == NULL)
     215             :         {
     216           0 :             TIFFErrorExtR(tif, module, "No space for LZW code table");
     217           0 :             return (0);
     218             :         }
     219             :         /*
     220             :          * Pre-load the table.
     221             :          */
     222        2474 :         code = 255;
     223       17085 :         do
     224             :         {
     225      632333 :             sp->dec_codetab[code].firstchar = (unsigned char)code;
     226      632333 :             sp->dec_codetab[code].value = (unsigned char)code;
     227      632333 :             sp->dec_codetab[code].repeated = true;
     228      632333 :             sp->dec_codetab[code].length = 1;
     229      632333 :             sp->dec_codetab[code].next = NULL;
     230      632333 :         } while (code--);
     231             :         /*
     232             :          * Zero-out the unused entries  */
     233             :         /* Silence false positive */
     234             :         /* coverity[overrun-buffer-arg] */
     235        2474 :         memset(&sp->dec_codetab[CODE_CLEAR], 0,
     236             :                (CODE_FIRST - CODE_CLEAR) * sizeof(code_t));
     237             :     }
     238        2478 :     return (1);
     239             : }
     240             : 
     241             : /*
     242             :  * Setup state for decoding a strip.
     243             :  */
     244        5494 : static int LZWPreDecode(TIFF *tif, uint16_t s)
     245             : {
     246             :     static const char module[] = "LZWPreDecode";
     247        5494 :     LZWCodecState *sp = LZWDecoderState(tif);
     248             : 
     249             :     (void)s;
     250        5494 :     assert(sp != NULL);
     251        5494 :     if (sp->dec_codetab == NULL)
     252             :     {
     253         100 :         tif->tif_setupdecode(tif);
     254         100 :         if (sp->dec_codetab == NULL)
     255           0 :             return (0);
     256             :     }
     257             : 
     258             :     /*
     259             :      * Check for old bit-reversed codes.
     260             :      */
     261        5494 :     if (tif->tif_rawcc >= 2 && tif->tif_rawdata[0] == 0 &&
     262         104 :         (tif->tif_rawdata[1] & 0x1))
     263             :     {
     264             : #ifdef LZW_COMPAT
     265         104 :         if (!sp->dec_decode)
     266             :         {
     267           3 :             TIFFWarningExtR(tif, module, "Old-style LZW codes, convert file");
     268             :             /*
     269             :              * Override default decoding methods with
     270             :              * ones that deal with the old coding.
     271             :              * Otherwise the predictor versions set
     272             :              * above will call the compatibility routines
     273             :              * through the dec_decode method.
     274             :              */
     275           3 :             tif->tif_decoderow = LZWDecodeCompat;
     276           3 :             tif->tif_decodestrip = LZWDecodeCompat;
     277           3 :             tif->tif_decodetile = LZWDecodeCompat;
     278             :             /*
     279             :              * If doing horizontal differencing, must
     280             :              * re-setup the predictor logic since we
     281             :              * switched the basic decoder methods...
     282             :              */
     283           3 :             (*tif->tif_setupdecode)(tif);
     284           3 :             sp->dec_decode = LZWDecodeCompat;
     285             :         }
     286         104 :         sp->lzw_maxcode = MAXCODE(BITS_MIN);
     287             : #else  /* !LZW_COMPAT */
     288             :         if (!sp->dec_decode)
     289             :         {
     290             :             TIFFErrorExtR(tif, module, "Old-style LZW codes not supported");
     291             :             sp->dec_decode = LZWDecode;
     292             :         }
     293             :         return (0);
     294             : #endif /* !LZW_COMPAT */
     295             :     }
     296             :     else
     297             :     {
     298        5390 :         sp->lzw_maxcode = MAXCODE(BITS_MIN) - 1;
     299        5390 :         sp->dec_decode = LZWDecode;
     300             :     }
     301        5494 :     sp->lzw_nbits = BITS_MIN;
     302        5494 :     sp->lzw_nextbits = 0;
     303        5494 :     sp->lzw_nextdata = 0;
     304             : 
     305        5494 :     sp->dec_restart = 0;
     306        5494 :     sp->dec_nbitsmask = MAXCODE(BITS_MIN);
     307        5494 :     sp->dec_bitsleft = 0;
     308        5494 :     sp->old_tif_rawcc = 0;
     309        5494 :     sp->dec_free_entp = sp->dec_codetab - 1; // + CODE_FIRST;
     310             :     /*
     311             :      * Zero entries that are not yet filled in.  We do
     312             :      * this to guard against bogus input data that causes
     313             :      * us to index into undefined entries.  If you can
     314             :      * come up with a way to safely bounds-check input codes
     315             :      * while decoding then you can remove this operation.
     316             :      */
     317        5494 :     sp->dec_oldcodep = &sp->dec_codetab[0];
     318        5494 :     sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask - 1];
     319        5494 :     sp->read_error = 0;
     320        5494 :     return (1);
     321             : }
     322             : 
     323             : /*
     324             :  * Decode a "hunk of data".
     325             :  */
     326             : 
     327             : /* Get the next 32 or 64-bit from the input data */
     328             : #ifdef WORDS_BIGENDIAN
     329             : #define GetNextData(nextdata, bp) memcpy(&nextdata, bp, sizeof(nextdata))
     330             : #elif SIZEOF_WORDTYPE == 8
     331             : #if defined(_M_X64)
     332             : #define GetNextData(nextdata, bp) nextdata = _byteswap_uint64(*(uint64_t *)(bp))
     333             : #elif defined(__GNUC__)
     334             : #define GetNextData(nextdata, bp)                                              \
     335             :     memcpy(&nextdata, bp, sizeof(nextdata));                                   \
     336             :     nextdata = __builtin_bswap64(nextdata)
     337             : #else
     338             : #define GetNextData(nextdata, bp)                                              \
     339             :     nextdata = (((uint64_t)bp[0]) << 56) | (((uint64_t)bp[1]) << 48) |         \
     340             :                (((uint64_t)bp[2]) << 40) | (((uint64_t)bp[3]) << 32) |         \
     341             :                (((uint64_t)bp[4]) << 24) | (((uint64_t)bp[5]) << 16) |         \
     342             :                (((uint64_t)bp[6]) << 8) | (((uint64_t)bp[7]))
     343             : #endif
     344             : #elif SIZEOF_WORDTYPE == 4
     345             : #if defined(_M_X86)
     346             : #define GetNextData(nextdata, bp)                                              \
     347             :     nextdata = _byteswap_ulong(*(unsigned long *)(bp))
     348             : #elif defined(__GNUC__)
     349             : #define GetNextData(nextdata, bp)                                              \
     350             :     memcpy(&nextdata, bp, sizeof(nextdata));                                   \
     351             :     nextdata = __builtin_bswap32(nextdata)
     352             : #else
     353             : #define GetNextData(nextdata, bp)                                              \
     354             :     nextdata = (((uint32_t)bp[0]) << 24) | (((uint32_t)bp[1]) << 16) |         \
     355             :                (((uint32_t)bp[2]) << 8) | (((uint32_t)bp[3]))
     356             : #endif
     357             : #else
     358             : #error "Unhandled SIZEOF_WORDTYPE"
     359             : #endif
     360             : 
     361             : #define GetNextCodeLZW()                                                       \
     362             :     do                                                                         \
     363             :     {                                                                          \
     364             :         nextbits -= nbits;                                                     \
     365             :         if (nextbits < 0)                                                      \
     366             :         {                                                                      \
     367             :             if (dec_bitsleft >= 8 * SIZEOF_WORDTYPE)                           \
     368             :             {                                                                  \
     369             :                 unsigned codetmp = (unsigned)(nextdata << (-nextbits));        \
     370             :                 GetNextData(nextdata, bp);                                     \
     371             :                 bp += SIZEOF_WORDTYPE;                                         \
     372             :                 nextbits += 8 * SIZEOF_WORDTYPE;                               \
     373             :                 dec_bitsleft -= 8 * SIZEOF_WORDTYPE;                           \
     374             :                 code = (WordType)((codetmp | (nextdata >> nextbits)) &         \
     375             :                                   nbitsmask);                                  \
     376             :                 break;                                                         \
     377             :             }                                                                  \
     378             :             else                                                               \
     379             :             {                                                                  \
     380             :                 if (dec_bitsleft < 8)                                          \
     381             :                 {                                                              \
     382             :                     goto no_eoi;                                               \
     383             :                 }                                                              \
     384             :                 nextdata = (nextdata << 8) | *(bp)++;                          \
     385             :                 nextbits += 8;                                                 \
     386             :                 dec_bitsleft -= 8;                                             \
     387             :                 if (nextbits < 0)                                              \
     388             :                 {                                                              \
     389             :                     if (dec_bitsleft < 8)                                      \
     390             :                     {                                                          \
     391             :                         goto no_eoi;                                           \
     392             :                     }                                                          \
     393             :                     nextdata = (nextdata << 8) | *(bp)++;                      \
     394             :                     nextbits += 8;                                             \
     395             :                     dec_bitsleft -= 8;                                         \
     396             :                 }                                                              \
     397             :             }                                                                  \
     398             :         }                                                                      \
     399             :         code = (WordType)((nextdata >> nextbits) & nbitsmask);                 \
     400             :     } while (0)
     401             : 
     402      113604 : static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
     403             : {
     404             :     static const char module[] = "LZWDecode";
     405      113604 :     LZWCodecState *sp = LZWDecoderState(tif);
     406      113604 :     uint8_t *op = (uint8_t *)op0;
     407      113604 :     tmsize_t occ = occ0;
     408             :     uint8_t *bp;
     409             :     long nbits, nextbits, nbitsmask;
     410             :     WordType nextdata;
     411             :     code_t *free_entp, *maxcodep, *oldcodep;
     412             : 
     413             :     (void)s;
     414      113604 :     assert(sp != NULL);
     415      113604 :     assert(sp->dec_codetab != NULL);
     416             : 
     417      113604 :     if (sp->read_error)
     418             :     {
     419           0 :         memset(op, 0, (size_t)occ);
     420           0 :         TIFFErrorExtR(tif, module,
     421             :                       "LZWDecode: Scanline %" PRIu32 " cannot be read due to "
     422             :                       "previous error",
     423             :                       tif->tif_row);
     424           0 :         return 0;
     425             :     }
     426             : 
     427             :     /*
     428             :      * Restart interrupted output operation.
     429             :      */
     430      113604 :     if (sp->dec_restart)
     431             :     {
     432             :         tmsize_t residue;
     433             : 
     434      104113 :         code_t *codep = sp->dec_codep;
     435      104113 :         residue = codep->length - sp->dec_restart;
     436      104113 :         if (residue > occ)
     437             :         {
     438             :             /*
     439             :              * Residue from previous decode is sufficient
     440             :              * to satisfy decode request.  Skip to the
     441             :              * start of the decoded string, place decoded
     442             :              * values in the output buffer, and return.
     443             :              */
     444       99868 :             sp->dec_restart += occ;
     445           0 :             do
     446             :             {
     447     3160750 :                 codep = codep->next;
     448     3160750 :             } while (--residue > occ && codep);
     449       99868 :             if (codep)
     450             :             {
     451       99868 :                 uint8_t *tp = op + occ;
     452           0 :                 do
     453             :                 {
     454      176900 :                     *--tp = codep->value;
     455      176900 :                     codep = codep->next;
     456      176900 :                 } while (--occ && codep);
     457             :             }
     458       99868 :             return (1);
     459             :         }
     460             :         /*
     461             :          * Residue satisfies only part of the decode request.
     462             :          */
     463        4245 :         op += residue;
     464        4245 :         occ -= residue;
     465        4245 :         uint8_t *tp = op;
     466           0 :         do
     467             :         {
     468        6912 :             *--tp = codep->value;
     469        6912 :             codep = codep->next;
     470        6912 :         } while (--residue && codep);
     471        4245 :         sp->dec_restart = 0;
     472             :     }
     473             : 
     474       13736 :     bp = (uint8_t *)tif->tif_rawcp;
     475       13736 :     sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
     476       13736 :     uint64_t dec_bitsleft = sp->dec_bitsleft;
     477       13736 :     nbits = sp->lzw_nbits;
     478       13736 :     nextdata = sp->lzw_nextdata;
     479       13736 :     nextbits = sp->lzw_nextbits;
     480       13736 :     nbitsmask = sp->dec_nbitsmask;
     481       13736 :     oldcodep = sp->dec_oldcodep;
     482       13736 :     free_entp = sp->dec_free_entp;
     483       13736 :     maxcodep = sp->dec_maxcodep;
     484       13736 :     code_t *const dec_codetab = sp->dec_codetab;
     485             :     code_t *codep;
     486             : 
     487       13736 :     if (occ == 0)
     488             :     {
     489        2276 :         goto after_loop;
     490             :     }
     491             : 
     492       11460 : begin:
     493             : {
     494             :     WordType code;
     495    24928417 :     GetNextCodeLZW();
     496    24928417 :     codep = dec_codetab + code;
     497    24928417 :     if (code >= CODE_FIRST)
     498    20760218 :         goto code_above_or_equal_to_258;
     499     4168209 :     if (code < 256)
     500     4154924 :         goto code_below_256;
     501       13286 :     if (code == CODE_EOI)
     502          10 :         goto after_loop;
     503       13276 :     goto code_clear;
     504             : 
     505     4154924 : code_below_256:
     506             : {
     507     4154924 :     if (codep > free_entp)
     508           0 :         goto error_code;
     509     4154924 :     free_entp->next = oldcodep;
     510     4154924 :     free_entp->firstchar = oldcodep->firstchar;
     511     4154924 :     free_entp->length = oldcodep->length + 1;
     512     4154924 :     free_entp->value = (uint8_t)code;
     513     4154924 :     free_entp->repeated =
     514     4154924 :         (bool)(oldcodep->repeated & (oldcodep->value == code));
     515     4154924 :     if (++free_entp > maxcodep)
     516             :     {
     517        4210 :         if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
     518           0 :             nbits = BITS_MAX;
     519        4210 :         nbitsmask = MAXCODE(nbits);
     520        4210 :         maxcodep = dec_codetab + nbitsmask - 1;
     521        4210 :         if (free_entp >= &dec_codetab[CSIZE])
     522             :         {
     523             :             /* At that point, the next valid states are either EOI or a */
     524             :             /* CODE_CLEAR. If a regular code is read, at the next */
     525             :             /* attempt at registering a new entry, we will error out */
     526             :             /* due to setting free_entp before any valid code */
     527           0 :             free_entp = dec_codetab - 1;
     528             :         }
     529             :     }
     530     4154924 :     oldcodep = codep;
     531     4154924 :     *op++ = (uint8_t)code;
     532     4154924 :     occ--;
     533     4154924 :     if (occ == 0)
     534        2687 :         goto after_loop;
     535     4152238 :     goto begin;
     536             : }
     537             : 
     538    20760218 : code_above_or_equal_to_258:
     539             : {
     540             :     /*
     541             :      * Add the new entry to the code table.
     542             :      */
     543             : 
     544    20760218 :     if (codep >= free_entp)
     545             :     {
     546     3295872 :         if (codep != free_entp)
     547           2 :             goto error_code;
     548     3295871 :         free_entp->value = oldcodep->firstchar;
     549             :     }
     550             :     else
     551             :     {
     552    17464346 :         free_entp->value = codep->firstchar;
     553             :     }
     554    20760217 :     free_entp->repeated =
     555    20760217 :         (bool)(oldcodep->repeated & (oldcodep->value == free_entp->value));
     556    20760217 :     free_entp->next = oldcodep;
     557             : 
     558    20760217 :     free_entp->firstchar = oldcodep->firstchar;
     559    20760217 :     free_entp->length = oldcodep->length + 1;
     560    20760217 :     if (++free_entp > maxcodep)
     561             :     {
     562       17167 :         if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
     563           0 :             nbits = BITS_MAX;
     564       17167 :         nbitsmask = MAXCODE(nbits);
     565       17167 :         maxcodep = dec_codetab + nbitsmask - 1;
     566       17167 :         if (free_entp >= &dec_codetab[CSIZE])
     567             :         {
     568             :             /* At that point, the next valid states are either EOI or a */
     569             :             /* CODE_CLEAR. If a regular code is read, at the next */
     570             :             /* attempt at registering a new entry, we will error out */
     571             :             /* due to setting free_entp before any valid code */
     572           0 :             free_entp = dec_codetab - 1;
     573             :         }
     574             :     }
     575    20760217 :     oldcodep = codep;
     576             : 
     577             :     /*
     578             :      * Code maps to a string, copy string
     579             :      * value to output (written in reverse).
     580             :      */
     581             :     /* tiny bit faster on x86_64 to store in unsigned short than int */
     582    20760217 :     unsigned short len = codep->length;
     583             : 
     584    20760217 :     if (len < 3) /* equivalent to len == 2 given all other conditions */
     585             :     {
     586     3297781 :         if (occ <= 2)
     587             :         {
     588         582 :             if (occ == 2)
     589             :             {
     590         535 :                 memcpy(op, &(codep->firstchar), 2);
     591         535 :                 op += 2;
     592         535 :                 occ -= 2;
     593         535 :                 goto after_loop;
     594             :             }
     595          47 :             goto too_short_buffer;
     596             :         }
     597             : 
     598     3297208 :         memcpy(op, &(codep->firstchar), 2);
     599     3297208 :         op += 2;
     600     3297208 :         occ -= 2;
     601     3297208 :         goto begin; /* we can save the comparison occ > 0 */
     602             :     }
     603             : 
     604    17462396 :     if (len == 3)
     605             :     {
     606     2500858 :         if (occ <= 3)
     607             :         {
     608         332 :             if (occ == 3)
     609             :             {
     610         270 :                 op[0] = codep->firstchar;
     611         270 :                 op[1] = codep->next->value;
     612         270 :                 op[2] = codep->value;
     613         270 :                 op += 3;
     614         270 :                 occ -= 3;
     615         270 :                 goto after_loop;
     616             :             }
     617          62 :             goto too_short_buffer;
     618             :         }
     619             : 
     620     2500527 :         op[0] = codep->firstchar;
     621     2500527 :         op[1] = codep->next->value;
     622     2500527 :         op[2] = codep->value;
     623     2500527 :         op += 3;
     624     2500527 :         occ -= 3;
     625     2500527 :         goto begin; /* we can save the comparison occ > 0 */
     626             :     }
     627             : 
     628    14961528 :     if (len > occ)
     629             :     {
     630        4320 :         goto too_short_buffer;
     631             :     }
     632             : 
     633    14957228 :     if (codep->repeated)
     634             :     {
     635      659888 :         memset(op, codep->value, len);
     636      659888 :         op += len;
     637      659888 :         occ -= len;
     638      659888 :         if (occ == 0)
     639        3161 :             goto after_loop;
     640      656727 :         goto begin;
     641             :     }
     642             : 
     643    14297316 :     uint8_t *tp = op + len;
     644             : 
     645    14297316 :     assert(len >= 4);
     646             : 
     647    14297316 :     *--tp = codep->value;
     648    14297316 :     codep = codep->next;
     649    14297316 :     *--tp = codep->value;
     650    14297316 :     codep = codep->next;
     651    14297316 :     *--tp = codep->value;
     652    14297316 :     codep = codep->next;
     653    14297316 :     *--tp = codep->value;
     654    14297316 :     if (tp > op)
     655             :     {
     656      309809 :         do
     657             :         {
     658   111546991 :             codep = codep->next;
     659   111546991 :             *--tp = codep->value;
     660   111546991 :         } while (tp > op);
     661             :     }
     662             : 
     663    14297316 :     assert(occ >= len);
     664    14297316 :     op += len;
     665    14297316 :     occ -= len;
     666    14297316 :     if (occ == 0)
     667         337 :         goto after_loop;
     668    14297000 :     goto begin;
     669             : }
     670             : 
     671       13276 : code_clear:
     672             : {
     673       13276 :     free_entp = dec_codetab + CODE_FIRST;
     674       13276 :     nbits = BITS_MIN;
     675       13276 :     nbitsmask = MAXCODE(BITS_MIN);
     676       13276 :     maxcodep = dec_codetab + nbitsmask - 1;
     677           0 :     do
     678             :     {
     679       10977 :         GetNextCodeLZW();
     680       10977 :     } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
     681       13276 :     if (code == CODE_EOI)
     682           0 :         goto after_loop;
     683       13276 :     if (code > CODE_EOI)
     684             :     {
     685           0 :         goto error_code;
     686             :     }
     687       13276 :     *op++ = (uint8_t)code;
     688       13276 :     occ--;
     689       13276 :     oldcodep = dec_codetab + code;
     690       13276 :     if (occ == 0)
     691          29 :         goto after_loop;
     692       13247 :     goto begin;
     693             : }
     694             : }
     695             : 
     696        4429 : too_short_buffer:
     697             : {
     698             :     /*
     699             :      * String is too long for decode buffer,
     700             :      * locate portion that will fit, copy to
     701             :      * the decode buffer, and setup restart
     702             :      * logic for the next decoding call.
     703             :      */
     704        4429 :     sp->dec_codep = codep;
     705           0 :     do
     706             :     {
     707      196923 :         codep = codep->next;
     708      196923 :     } while (codep->length > occ);
     709             : 
     710        4429 :     sp->dec_restart = occ;
     711        4429 :     uint8_t *tp = op + occ;
     712           0 :     do
     713             :     {
     714       19244 :         *--tp = codep->value;
     715       19244 :         codep = codep->next;
     716       19244 :     } while (--occ);
     717             : }
     718             : 
     719        4429 : after_loop:
     720       13734 :     tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
     721       13734 :     tif->tif_rawcp = (uint8_t *)bp;
     722       13734 :     sp->old_tif_rawcc = tif->tif_rawcc;
     723       13734 :     sp->dec_bitsleft = dec_bitsleft;
     724       13734 :     sp->lzw_nbits = (unsigned short)nbits;
     725       13734 :     sp->lzw_nextdata = nextdata;
     726       13734 :     sp->lzw_nextbits = nextbits;
     727       13734 :     sp->dec_nbitsmask = nbitsmask;
     728       13734 :     sp->dec_oldcodep = oldcodep;
     729       13734 :     sp->dec_free_entp = free_entp;
     730       13734 :     sp->dec_maxcodep = maxcodep;
     731             : 
     732       13734 :     if (occ > 0)
     733             :     {
     734          10 :         memset(op, 0, (size_t)occ);
     735          10 :         TIFFErrorExtR(tif, module,
     736             :                       "Not enough data at scanline %" PRIu32 " (short %" PRIu64
     737             :                       " bytes)",
     738             :                       tif->tif_row, (uint64_t)occ);
     739          10 :         return (0);
     740             :     }
     741       13724 :     return (1);
     742             : 
     743           0 : no_eoi:
     744           0 :     memset(op, 0, (size_t)occ);
     745           0 :     sp->read_error = 1;
     746           0 :     TIFFErrorExtR(tif, module,
     747             :                   "LZWDecode: Strip %" PRIu32 " not terminated with EOI code",
     748             :                   tif->tif_curstrip);
     749           0 :     return 0;
     750           2 : error_code:
     751           2 :     memset(op, 0, (size_t)occ);
     752           2 :     sp->read_error = 1;
     753           2 :     TIFFErrorExtR(tif, tif->tif_name, "Using code not yet in table");
     754           2 :     return 0;
     755             : }
     756             : 
     757             : #ifdef LZW_COMPAT
     758             : 
     759             : /*
     760             :  * This check shouldn't be necessary because each
     761             :  * strip is suppose to be terminated with CODE_EOI.
     762             :  */
     763             : #define NextCode(_tif, _sp, _bp, _code, _get, dec_bitsleft)                    \
     764             :     {                                                                          \
     765             :         if (dec_bitsleft < (uint64_t)nbits)                                    \
     766             :         {                                                                      \
     767             :             TIFFWarningExtR(_tif, module,                                      \
     768             :                             "LZWDecode: Strip %" PRIu32                        \
     769             :                             " not terminated with EOI code",                   \
     770             :                             _tif->tif_curstrip);                               \
     771             :             _code = CODE_EOI;                                                  \
     772             :         }                                                                      \
     773             :         else                                                                   \
     774             :         {                                                                      \
     775             :             _get(_sp, _bp, _code);                                             \
     776             :             dec_bitsleft -= nbits;                                             \
     777             :         }                                                                      \
     778             :     }
     779             : 
     780             : /*
     781             :  * Decode a "hunk of data" for old images.
     782             :  */
     783             : #define GetNextCodeCompat(sp, bp, code)                                        \
     784             :     {                                                                          \
     785             :         nextdata |= (unsigned long)*(bp)++ << nextbits;                        \
     786             :         nextbits += 8;                                                         \
     787             :         if (nextbits < nbits)                                                  \
     788             :         {                                                                      \
     789             :             nextdata |= (unsigned long)*(bp)++ << nextbits;                    \
     790             :             nextbits += 8;                                                     \
     791             :         }                                                                      \
     792             :         code = (hcode_t)(nextdata & nbitsmask);                                \
     793             :         nextdata >>= nbits;                                                    \
     794             :         nextbits -= nbits;                                                     \
     795             :     }
     796             : 
     797         104 : static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
     798             : {
     799             :     static const char module[] = "LZWDecodeCompat";
     800         104 :     LZWCodecState *sp = LZWDecoderState(tif);
     801         104 :     uint8_t *op = (uint8_t *)op0;
     802         104 :     tmsize_t occ = occ0;
     803             :     uint8_t *tp;
     804             :     uint8_t *bp;
     805             :     int code, nbits;
     806             :     int len;
     807             :     long nextbits, nbitsmask;
     808             :     WordType nextdata;
     809             :     code_t *codep, *free_entp, *maxcodep, *oldcodep;
     810             : 
     811             :     (void)s;
     812         104 :     assert(sp != NULL);
     813             : 
     814             :     /*
     815             :      * Restart interrupted output operation.
     816             :      */
     817         104 :     if (sp->dec_restart)
     818             :     {
     819             :         tmsize_t residue;
     820             : 
     821           0 :         codep = sp->dec_codep;
     822           0 :         residue = codep->length - sp->dec_restart;
     823           0 :         if (residue > occ)
     824             :         {
     825             :             /*
     826             :              * Residue from previous decode is sufficient
     827             :              * to satisfy decode request.  Skip to the
     828             :              * start of the decoded string, place decoded
     829             :              * values in the output buffer, and return.
     830             :              */
     831           0 :             sp->dec_restart += occ;
     832           0 :             do
     833             :             {
     834           0 :                 codep = codep->next;
     835           0 :             } while (--residue > occ);
     836           0 :             tp = op + occ;
     837           0 :             do
     838             :             {
     839           0 :                 *--tp = codep->value;
     840           0 :                 codep = codep->next;
     841           0 :             } while (--occ);
     842           0 :             return (1);
     843             :         }
     844             :         /*
     845             :          * Residue satisfies only part of the decode request.
     846             :          */
     847           0 :         op += residue;
     848           0 :         occ -= residue;
     849           0 :         tp = op;
     850           0 :         do
     851             :         {
     852           0 :             *--tp = codep->value;
     853           0 :             codep = codep->next;
     854           0 :         } while (--residue);
     855           0 :         sp->dec_restart = 0;
     856             :     }
     857             : 
     858         104 :     bp = (uint8_t *)tif->tif_rawcp;
     859             : 
     860         104 :     sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
     861         104 :     uint64_t dec_bitsleft = sp->dec_bitsleft;
     862             : 
     863         104 :     nbits = sp->lzw_nbits;
     864         104 :     nextdata = sp->lzw_nextdata;
     865         104 :     nextbits = sp->lzw_nextbits;
     866         104 :     nbitsmask = sp->dec_nbitsmask;
     867         104 :     oldcodep = sp->dec_oldcodep;
     868         104 :     free_entp = sp->dec_free_entp;
     869         104 :     maxcodep = sp->dec_maxcodep;
     870             : 
     871      208335 :     while (occ > 0)
     872             :     {
     873      208231 :         NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
     874      208231 :         if (code == CODE_EOI)
     875           0 :             break;
     876      208231 :         if (code == CODE_CLEAR)
     877             :         {
     878           0 :             do
     879             :             {
     880         104 :                 free_entp = sp->dec_codetab + CODE_FIRST;
     881         104 :                 _TIFFmemset(free_entp, 0,
     882             :                             (CSIZE - CODE_FIRST) * sizeof(code_t));
     883         104 :                 nbits = BITS_MIN;
     884         104 :                 nbitsmask = MAXCODE(BITS_MIN);
     885         104 :                 maxcodep = sp->dec_codetab + nbitsmask;
     886         104 :                 NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
     887         104 :             } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
     888         104 :             if (code == CODE_EOI)
     889           0 :                 break;
     890         104 :             if (code > CODE_CLEAR)
     891             :             {
     892           0 :                 TIFFErrorExtR(
     893           0 :                     tif, tif->tif_name,
     894             :                     "LZWDecode: Corrupted LZW table at scanline %" PRIu32,
     895             :                     tif->tif_row);
     896           0 :                 return (0);
     897             :             }
     898         104 :             *op++ = (uint8_t)code;
     899         104 :             occ--;
     900         104 :             oldcodep = sp->dec_codetab + code;
     901         104 :             continue;
     902             :         }
     903      208127 :         codep = sp->dec_codetab + code;
     904             : 
     905             :         /*
     906             :          * Add the new entry to the code table.
     907             :          */
     908      208127 :         if (free_entp < &sp->dec_codetab[0] ||
     909      208127 :             free_entp >= &sp->dec_codetab[CSIZE])
     910             :         {
     911           0 :             TIFFErrorExtR(tif, module,
     912             :                           "Corrupted LZW table at scanline %" PRIu32,
     913             :                           tif->tif_row);
     914           0 :             return (0);
     915             :         }
     916             : 
     917      208127 :         free_entp->next = oldcodep;
     918      208127 :         if (free_entp->next < &sp->dec_codetab[0] ||
     919      208127 :             free_entp->next >= &sp->dec_codetab[CSIZE])
     920             :         {
     921           0 :             TIFFErrorExtR(tif, module,
     922             :                           "Corrupted LZW table at scanline %" PRIu32,
     923             :                           tif->tif_row);
     924           0 :             return (0);
     925             :         }
     926      208127 :         free_entp->firstchar = free_entp->next->firstchar;
     927      208127 :         free_entp->length = free_entp->next->length + 1;
     928      208127 :         free_entp->value =
     929         123 :             (codep < free_entp) ? codep->firstchar : free_entp->firstchar;
     930      208127 :         if (++free_entp > maxcodep)
     931             :         {
     932        8825 :             if (++nbits > BITS_MAX) /* should not happen */
     933        8645 :                 nbits = BITS_MAX;
     934        8825 :             nbitsmask = MAXCODE(nbits);
     935        8825 :             maxcodep = sp->dec_codetab + nbitsmask;
     936             :         }
     937      208127 :         oldcodep = codep;
     938      208127 :         if (code >= 256)
     939             :         {
     940             :             /*
     941             :              * Code maps to a string, copy string
     942             :              * value to output (written in reverse).
     943             :              */
     944       69239 :             if (codep->length == 0)
     945             :             {
     946           0 :                 TIFFErrorExtR(
     947             :                     tif, module,
     948             :                     "Wrong length of decoded "
     949             :                     "string: data probably corrupted at scanline %" PRIu32,
     950             :                     tif->tif_row);
     951           0 :                 return (0);
     952             :             }
     953       69239 :             if (codep->length > occ)
     954             :             {
     955             :                 /*
     956             :                  * String is too long for decode buffer,
     957             :                  * locate portion that will fit, copy to
     958             :                  * the decode buffer, and setup restart
     959             :                  * logic for the next decoding call.
     960             :                  */
     961           0 :                 sp->dec_codep = codep;
     962           0 :                 do
     963             :                 {
     964           0 :                     codep = codep->next;
     965           0 :                 } while (codep->length > occ);
     966           0 :                 sp->dec_restart = occ;
     967           0 :                 tp = op + occ;
     968           0 :                 do
     969             :                 {
     970           0 :                     *--tp = codep->value;
     971           0 :                     codep = codep->next;
     972           0 :                 } while (--occ);
     973           0 :                 break;
     974             :             }
     975       69239 :             len = codep->length;
     976       69239 :             tp = op + len;
     977        7556 :             do
     978             :             {
     979      658192 :                 *--tp = codep->value;
     980      658192 :                 codep = codep->next;
     981      658192 :             } while (codep && tp > op);
     982       69239 :             assert(occ >= len);
     983       69239 :             op += len;
     984       69239 :             occ -= len;
     985             :         }
     986             :         else
     987             :         {
     988      138888 :             *op++ = (uint8_t)code;
     989      138888 :             occ--;
     990             :         }
     991             :     }
     992             : 
     993         104 :     tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
     994         104 :     tif->tif_rawcp = (uint8_t *)bp;
     995             : 
     996         104 :     sp->old_tif_rawcc = tif->tif_rawcc;
     997         104 :     sp->dec_bitsleft = dec_bitsleft;
     998             : 
     999         104 :     sp->lzw_nbits = (unsigned short)nbits;
    1000         104 :     sp->lzw_nextdata = nextdata;
    1001         104 :     sp->lzw_nextbits = nextbits;
    1002         104 :     sp->dec_nbitsmask = nbitsmask;
    1003         104 :     sp->dec_oldcodep = oldcodep;
    1004         104 :     sp->dec_free_entp = free_entp;
    1005         104 :     sp->dec_maxcodep = maxcodep;
    1006             : 
    1007         104 :     if (occ > 0)
    1008             :     {
    1009           0 :         TIFFErrorExtR(tif, module,
    1010             :                       "Not enough data at scanline %" PRIu32 " (short %" PRIu64
    1011             :                       " bytes)",
    1012             :                       tif->tif_row, (uint64_t)occ);
    1013           0 :         return (0);
    1014             :     }
    1015         104 :     return (1);
    1016             : }
    1017             : #endif /* LZW_COMPAT */
    1018             : 
    1019             : #ifndef LZW_READ_ONLY
    1020             : 
    1021             : static void cl_hash(LZWCodecState *);
    1022             : 
    1023             : /*
    1024             :  * LZW Encoding.
    1025             :  */
    1026             : 
    1027       11275 : static int LZWSetupEncode(TIFF *tif)
    1028             : {
    1029             :     static const char module[] = "LZWSetupEncode";
    1030       11275 :     LZWCodecState *sp = LZWEncoderState(tif);
    1031             : 
    1032       11275 :     assert(sp != NULL);
    1033       11275 :     sp->enc_hashtab = (hash_t *)_TIFFmallocExt(tif, HSIZE * sizeof(hash_t));
    1034       11275 :     if (sp->enc_hashtab == NULL)
    1035             :     {
    1036           0 :         TIFFErrorExtR(tif, module, "No space for LZW hash table");
    1037           0 :         return (0);
    1038             :     }
    1039       11275 :     return (1);
    1040             : }
    1041             : 
    1042             : /*
    1043             :  * Reset encoding state at the start of a strip.
    1044             :  */
    1045       12938 : static int LZWPreEncode(TIFF *tif, uint16_t s)
    1046             : {
    1047       12938 :     LZWCodecState *sp = LZWEncoderState(tif);
    1048             : 
    1049             :     (void)s;
    1050       12938 :     assert(sp != NULL);
    1051             : 
    1052       12938 :     if (sp->enc_hashtab == NULL)
    1053             :     {
    1054           0 :         tif->tif_setupencode(tif);
    1055             :     }
    1056             : 
    1057       12938 :     sp->lzw_nbits = BITS_MIN;
    1058       12938 :     sp->lzw_maxcode = MAXCODE(BITS_MIN);
    1059       12938 :     sp->lzw_free_ent = CODE_FIRST;
    1060       12938 :     sp->lzw_nextbits = 0;
    1061       12938 :     sp->lzw_nextdata = 0;
    1062       12938 :     sp->enc_checkpoint = CHECK_GAP;
    1063       12938 :     sp->enc_ratio = 0;
    1064       12938 :     sp->enc_incount = 0;
    1065       12938 :     sp->enc_outcount = 0;
    1066             :     /*
    1067             :      * The 4 here insures there is space for 2 max-sized
    1068             :      * codes in LZWEncode and LZWPostDecode.
    1069             :      */
    1070       12938 :     sp->enc_rawlimit = tif->tif_rawdata + tif->tif_rawdatasize - 1 - 4;
    1071       12938 :     cl_hash(sp);                   /* clear hash table */
    1072       12938 :     sp->enc_oldcode = (hcode_t)-1; /* generates CODE_CLEAR in LZWEncode */
    1073       12938 :     return (1);
    1074             : }
    1075             : 
    1076             : #define CALCRATIO(sp, rat)                                                     \
    1077             :     {                                                                          \
    1078             :         if (incount > 0x007fffff)                                              \
    1079             :         { /* NB: shift will overflow */                                        \
    1080             :             rat = outcount >> 8;                                               \
    1081             :             rat = (rat == 0 ? 0x7fffffff : incount / rat);                     \
    1082             :         }                                                                      \
    1083             :         else                                                                   \
    1084             :             rat = (incount << 8) / outcount;                                   \
    1085             :     }
    1086             : 
    1087             : /* Explicit 0xff masking to make icc -check=conversions happy */
    1088             : #define PutNextCode(op, c)                                                     \
    1089             :     {                                                                          \
    1090             :         nextdata = (nextdata << nbits) | c;                                    \
    1091             :         nextbits += nbits;                                                     \
    1092             :         *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff);          \
    1093             :         nextbits -= 8;                                                         \
    1094             :         if (nextbits >= 8)                                                     \
    1095             :         {                                                                      \
    1096             :             *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff);      \
    1097             :             nextbits -= 8;                                                     \
    1098             :         }                                                                      \
    1099             :         outcount += nbits;                                                     \
    1100             :     }
    1101             : 
    1102             : /*
    1103             :  * Encode a chunk of pixels.
    1104             :  *
    1105             :  * Uses an open addressing double hashing (no chaining) on the
    1106             :  * prefix code/next character combination.  We do a variant of
    1107             :  * Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
    1108             :  * relatively-prime secondary probe.  Here, the modular division
    1109             :  * first probe is gives way to a faster exclusive-or manipulation.
    1110             :  * Also do block compression with an adaptive reset, whereby the
    1111             :  * code table is cleared when the compression ratio decreases,
    1112             :  * but after the table fills.  The variable-length output codes
    1113             :  * are re-sized at this point, and a CODE_CLEAR is generated
    1114             :  * for the decoder.
    1115             :  */
    1116       34934 : static int LZWEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
    1117             : {
    1118       34934 :     register LZWCodecState *sp = LZWEncoderState(tif);
    1119             :     register long fcode;
    1120             :     register hash_t *hp;
    1121             :     register int h, c;
    1122             :     hcode_t ent;
    1123             :     long disp;
    1124             :     tmsize_t incount, outcount, checkpoint;
    1125             :     WordType nextdata;
    1126             :     long nextbits;
    1127             :     int free_ent, maxcode, nbits;
    1128             :     uint8_t *op;
    1129             :     uint8_t *limit;
    1130             : 
    1131             :     (void)s;
    1132       34934 :     if (sp == NULL)
    1133           0 :         return (0);
    1134             : 
    1135       34934 :     assert(sp->enc_hashtab != NULL);
    1136             : 
    1137             :     /*
    1138             :      * Load local state.
    1139             :      */
    1140       34934 :     incount = sp->enc_incount;
    1141       34934 :     outcount = sp->enc_outcount;
    1142       34934 :     checkpoint = sp->enc_checkpoint;
    1143       34934 :     nextdata = sp->lzw_nextdata;
    1144       34934 :     nextbits = sp->lzw_nextbits;
    1145       34934 :     free_ent = sp->lzw_free_ent;
    1146       34934 :     maxcode = sp->lzw_maxcode;
    1147       34934 :     nbits = sp->lzw_nbits;
    1148       34934 :     op = tif->tif_rawcp;
    1149       34934 :     limit = sp->enc_rawlimit;
    1150       34934 :     ent = (hcode_t)sp->enc_oldcode;
    1151             : 
    1152       34934 :     if (ent == (hcode_t)-1 && cc > 0)
    1153             :     {
    1154             :         /*
    1155             :          * NB: This is safe because it can only happen
    1156             :          *     at the start of a strip where we know there
    1157             :          *     is space in the data buffer.
    1158             :          */
    1159       12938 :         PutNextCode(op, CODE_CLEAR);
    1160       12938 :         ent = *bp++;
    1161       12938 :         cc--;
    1162       12938 :         incount++;
    1163             :     }
    1164       34934 :     while (cc > 0)
    1165             :     {
    1166   566589000 :         c = *bp++;
    1167   566589000 :         cc--;
    1168   566589000 :         incount++;
    1169   566589000 :         fcode = ((long)c << BITS_MAX) + ent;
    1170   566589000 :         h = (c << HSHIFT) ^ ent; /* xor hashing */
    1171             : #ifdef _WINDOWS
    1172             :         /*
    1173             :          * Check hash index for an overflow.
    1174             :          */
    1175             :         if (h >= HSIZE)
    1176             :             h -= HSIZE;
    1177             : #endif
    1178   566589000 :         hp = &sp->enc_hashtab[h];
    1179   566589000 :         if (hp->hash == fcode)
    1180             :         {
    1181   446532000 :             ent = hp->code;
    1182   446532000 :             continue;
    1183             :         }
    1184   120057000 :         if (hp->hash >= 0)
    1185             :         {
    1186             :             /*
    1187             :              * Primary hash failed, check secondary hash.
    1188             :              */
    1189   101791000 :             disp = HSIZE - h;
    1190   101791000 :             if (h == 0)
    1191       15260 :                 disp = 1;
    1192             :             do
    1193             :             {
    1194             :                 /*
    1195             :                  * Avoid pointer arithmetic because of
    1196             :                  * wraparound problems with segments.
    1197             :                  */
    1198   130369000 :                 if ((h -= disp) < 0)
    1199   122010000 :                     h += HSIZE;
    1200   130369000 :                 hp = &sp->enc_hashtab[h];
    1201   130369000 :                 if (hp->hash == fcode)
    1202             :                 {
    1203    97084900 :                     ent = hp->code;
    1204    97084900 :                     goto hit;
    1205             :                 }
    1206    33284300 :             } while (hp->hash >= 0);
    1207             :         }
    1208             :         /*
    1209             :          * New entry, emit code and add to table.
    1210             :          */
    1211             :         /*
    1212             :          * Verify there is space in the buffer for the code
    1213             :          * and any potential Clear code that might be emitted
    1214             :          * below.  The value of limit is setup so that there
    1215             :          * are at least 4 bytes free--room for 2 codes.
    1216             :          */
    1217    22972100 :         if (op > limit)
    1218             :         {
    1219           1 :             tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
    1220           1 :             if (!TIFFFlushData1(tif))
    1221           0 :                 return 0;
    1222           1 :             op = tif->tif_rawdata;
    1223             :         }
    1224    22972100 :         PutNextCode(op, ent);
    1225    22972100 :         ent = (hcode_t)c;
    1226    22972100 :         hp->code = (hcode_t)(free_ent++);
    1227    22972100 :         hp->hash = fcode;
    1228    22972100 :         if (free_ent == CODE_MAX - 1)
    1229             :         {
    1230             :             /* table is full, emit clear code and reset */
    1231        5694 :             cl_hash(sp);
    1232        5694 :             sp->enc_ratio = 0;
    1233        5694 :             incount = 0;
    1234        5694 :             outcount = 0;
    1235        5694 :             free_ent = CODE_FIRST;
    1236        5694 :             PutNextCode(op, CODE_CLEAR);
    1237        5694 :             nbits = BITS_MIN;
    1238        5694 :             maxcode = MAXCODE(BITS_MIN);
    1239             :         }
    1240             :         else
    1241             :         {
    1242             :             /*
    1243             :              * If the next entry is going to be too big for
    1244             :              * the code size, then increase it, if possible.
    1245             :              */
    1246    22966400 :             if (free_ent > maxcode)
    1247             :             {
    1248       23365 :                 nbits++;
    1249       23365 :                 assert(nbits <= BITS_MAX);
    1250       23365 :                 maxcode = (int)MAXCODE(nbits);
    1251             :             }
    1252    22943100 :             else if (incount >= checkpoint)
    1253             :             {
    1254             :                 tmsize_t rat;
    1255             :                 /*
    1256             :                  * Check compression ratio and, if things seem
    1257             :                  * to be slipping, clear the hash table and
    1258             :                  * reset state.  The compression ratio is a
    1259             :                  * 24+8-bit fractional number.
    1260             :                  */
    1261       37420 :                 checkpoint = incount + CHECK_GAP;
    1262       37420 :                 CALCRATIO(sp, rat);
    1263       37420 :                 if (rat <= sp->enc_ratio)
    1264             :                 {
    1265         119 :                     cl_hash(sp);
    1266         119 :                     sp->enc_ratio = 0;
    1267         119 :                     incount = 0;
    1268         119 :                     outcount = 0;
    1269         119 :                     free_ent = CODE_FIRST;
    1270         119 :                     PutNextCode(op, CODE_CLEAR);
    1271         119 :                     nbits = BITS_MIN;
    1272         119 :                     maxcode = MAXCODE(BITS_MIN);
    1273             :                 }
    1274             :                 else
    1275       37301 :                     sp->enc_ratio = rat;
    1276             :             }
    1277             :         }
    1278   566624000 :     hit:;
    1279             :     }
    1280             : 
    1281             :     /*
    1282             :      * Restore global state.
    1283             :      */
    1284       34934 :     sp->enc_incount = incount;
    1285       34934 :     sp->enc_outcount = outcount;
    1286       34934 :     sp->enc_checkpoint = checkpoint;
    1287       34934 :     sp->enc_oldcode = ent;
    1288       34934 :     sp->lzw_nextdata = nextdata;
    1289       34934 :     sp->lzw_nextbits = nextbits;
    1290       34934 :     sp->lzw_free_ent = (unsigned short)free_ent;
    1291       34934 :     sp->lzw_maxcode = (unsigned short)maxcode;
    1292       34934 :     sp->lzw_nbits = (unsigned short)nbits;
    1293       34934 :     tif->tif_rawcp = op;
    1294       34934 :     return (1);
    1295             : }
    1296             : 
    1297             : /*
    1298             :  * Finish off an encoded strip by flushing the last
    1299             :  * string and tacking on an End Of Information code.
    1300             :  */
    1301       12938 : static int LZWPostEncode(TIFF *tif)
    1302             : {
    1303       12938 :     register LZWCodecState *sp = LZWEncoderState(tif);
    1304       12938 :     uint8_t *op = tif->tif_rawcp;
    1305       12938 :     long nextbits = sp->lzw_nextbits;
    1306       12938 :     WordType nextdata = sp->lzw_nextdata;
    1307       12938 :     tmsize_t outcount = sp->enc_outcount;
    1308       12938 :     int nbits = sp->lzw_nbits;
    1309             : 
    1310       12938 :     if (op > sp->enc_rawlimit)
    1311             :     {
    1312           0 :         tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
    1313           0 :         if (!TIFFFlushData1(tif))
    1314           0 :             return 0;
    1315           0 :         op = tif->tif_rawdata;
    1316             :     }
    1317       12938 :     if (sp->enc_oldcode != (hcode_t)-1)
    1318             :     {
    1319       12938 :         int free_ent = sp->lzw_free_ent;
    1320             : 
    1321       12938 :         PutNextCode(op, sp->enc_oldcode);
    1322       12938 :         sp->enc_oldcode = (hcode_t)-1;
    1323       12938 :         free_ent++;
    1324             : 
    1325       12938 :         if (free_ent == CODE_MAX - 1)
    1326             :         {
    1327             :             /* table is full, emit clear code and reset */
    1328           0 :             outcount = 0;
    1329           0 :             PutNextCode(op, CODE_CLEAR);
    1330           0 :             nbits = BITS_MIN;
    1331             :         }
    1332             :         else
    1333             :         {
    1334             :             /*
    1335             :              * If the next entry is going to be too big for
    1336             :              * the code size, then increase it, if possible.
    1337             :              */
    1338       12938 :             if (free_ent > sp->lzw_maxcode)
    1339             :             {
    1340           1 :                 nbits++;
    1341           1 :                 assert(nbits <= BITS_MAX);
    1342             :             }
    1343             :         }
    1344             :     }
    1345       12938 :     PutNextCode(op, CODE_EOI);
    1346             :     /* Explicit 0xff masking to make icc -check=conversions happy */
    1347       12938 :     if (nextbits > 0)
    1348       12841 :         *op++ = (unsigned char)((nextdata << (8 - nextbits)) & 0xff);
    1349       12938 :     tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
    1350             :     (void)outcount;
    1351       12938 :     return (1);
    1352             : }
    1353             : 
    1354             : /*
    1355             :  * Reset encoding hash table.
    1356             :  */
    1357       18750 : static void cl_hash(LZWCodecState *sp)
    1358             : {
    1359       18750 :     register hash_t *hp = &sp->enc_hashtab[HSIZE - 1];
    1360       18750 :     register long i = HSIZE - 8;
    1361             : 
    1362             :     do
    1363             :     {
    1364    21086700 :         i -= 8;
    1365    21086700 :         hp[-7].hash = -1;
    1366    21086700 :         hp[-6].hash = -1;
    1367    21086700 :         hp[-5].hash = -1;
    1368    21086700 :         hp[-4].hash = -1;
    1369    21086700 :         hp[-3].hash = -1;
    1370    21086700 :         hp[-2].hash = -1;
    1371    21086700 :         hp[-1].hash = -1;
    1372    21086700 :         hp[0].hash = -1;
    1373    21086700 :         hp -= 8;
    1374    21086700 :     } while (i >= 0);
    1375       37501 :     for (i += 8; i > 0; i--, hp--)
    1376       18751 :         hp->hash = -1;
    1377       18750 : }
    1378             : 
    1379             : #endif
    1380             : 
    1381       17832 : static void LZWCleanup(TIFF *tif)
    1382             : {
    1383       17832 :     (void)TIFFPredictorCleanup(tif);
    1384             : 
    1385       17833 :     assert(tif->tif_data != NULL);
    1386             : 
    1387       17833 :     if (LZWDecoderState(tif)->dec_codetab)
    1388        2474 :         _TIFFfreeExt(tif, LZWDecoderState(tif)->dec_codetab);
    1389             : 
    1390       17834 :     if (LZWEncoderState(tif)->enc_hashtab)
    1391       11273 :         _TIFFfreeExt(tif, LZWEncoderState(tif)->enc_hashtab);
    1392             : 
    1393       17836 :     _TIFFfreeExt(tif, tif->tif_data);
    1394       17833 :     tif->tif_data = NULL;
    1395             : 
    1396       17833 :     _TIFFSetDefaultCompressionState(tif);
    1397       17833 : }
    1398             : 
    1399       17837 : int TIFFInitLZW(TIFF *tif, int scheme)
    1400             : {
    1401             :     static const char module[] = "TIFFInitLZW";
    1402             :     (void)scheme;
    1403       17837 :     assert(scheme == COMPRESSION_LZW);
    1404             :     /*
    1405             :      * Allocate state block so tag methods have storage to record values.
    1406             :      */
    1407       17837 :     tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
    1408       17837 :     if (tif->tif_data == NULL)
    1409           0 :         goto bad;
    1410       17837 :     LZWDecoderState(tif)->dec_codetab = NULL;
    1411       17837 :     LZWDecoderState(tif)->dec_decode = NULL;
    1412       17837 :     LZWEncoderState(tif)->enc_hashtab = NULL;
    1413       17837 :     LZWState(tif)->rw_mode = tif->tif_mode;
    1414             : 
    1415             :     /*
    1416             :      * Install codec methods.
    1417             :      */
    1418       17837 :     tif->tif_fixuptags = LZWFixupTags;
    1419       17837 :     tif->tif_setupdecode = LZWSetupDecode;
    1420       17837 :     tif->tif_predecode = LZWPreDecode;
    1421       17837 :     tif->tif_decoderow = LZWDecode;
    1422       17837 :     tif->tif_decodestrip = LZWDecode;
    1423       17837 :     tif->tif_decodetile = LZWDecode;
    1424             : #ifndef LZW_READ_ONLY
    1425       17770 :     tif->tif_setupencode = LZWSetupEncode;
    1426       17770 :     tif->tif_preencode = LZWPreEncode;
    1427       17770 :     tif->tif_postencode = LZWPostEncode;
    1428       17770 :     tif->tif_encoderow = LZWEncode;
    1429       17770 :     tif->tif_encodestrip = LZWEncode;
    1430       17770 :     tif->tif_encodetile = LZWEncode;
    1431             : #endif
    1432       17837 :     tif->tif_cleanup = LZWCleanup;
    1433             :     /*
    1434             :      * Setup predictor setup.
    1435             :      */
    1436       17837 :     (void)TIFFPredictorInit(tif);
    1437       17829 :     return (1);
    1438           0 : bad:
    1439           0 :     TIFFErrorExtR(tif, module, "No space for LZW state block");
    1440           0 :     return (0);
    1441             : }
    1442             : 
    1443             : /*
    1444             :  * Copyright (c) 1985, 1986 The Regents of the University of California.
    1445             :  * All rights reserved.
    1446             :  *
    1447             :  * This code is derived from software contributed to Berkeley by
    1448             :  * James A. Woods, derived from original work by Spencer Thomas
    1449             :  * and Joseph Orost.
    1450             :  *
    1451             :  * Redistribution and use in source and binary forms are permitted
    1452             :  * provided that the above copyright notice and this paragraph are
    1453             :  * duplicated in all such forms and that any documentation,
    1454             :  * advertising materials, and other materials related to such
    1455             :  * distribution and use acknowledge that the software was developed
    1456             :  * by the University of California, Berkeley.  The name of the
    1457             :  * University may not be used to endorse or promote products derived
    1458             :  * from this software without specific prior written permission.
    1459             :  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
    1460             :  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
    1461             :  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    1462             :  */
    1463             : #endif /* LZW_SUPPORT */

Generated by: LCOV version 1.14