1 /*
   2  * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #include <stdio.h>
  27 #include "jni.h"
  28 #include "jni_util.h"
  29 
  30 #define OUTCODELENGTH 4097
  31 
  32 /* We use Get/ReleasePrimitiveArrayCritical functions to avoid
  33  * the need to copy buffer elements.
  34  *
  35  * MAKE SURE TO:
  36  *
  37  * - carefully insert pairs of RELEASE_ARRAYS and GET_ARRAYS around
  38  *   callbacks to Java.
  39  * - call RELEASE_ARRAYS before returning to Java.
  40  *
  41  * Otherwise things will go horribly wrong. There may be memory leaks,
  42  * excessive pinning, or even VM crashes!
  43  *
  44  * Note that GetPrimitiveArrayCritical may fail!
  45  */
  46 
  47 #define GET_ARRAYS() \
  48     prefix  = (short *) \
  49         (*env)->GetPrimitiveArrayCritical(env, prefixh, 0); \
  50     if (prefix == 0) \
  51         goto out_of_memory; \
  52     suffix  = (unsigned char *) \
  53         (*env)->GetPrimitiveArrayCritical(env, suffixh, 0); \
  54     if (suffix == 0) \
  55         goto out_of_memory; \
  56     outCode = (unsigned char *) \
  57         (*env)->GetPrimitiveArrayCritical(env, outCodeh, 0); \
  58     if (outCode == 0) \
  59         goto out_of_memory; \
  60     rasline = (unsigned char *) \
  61         (*env)->GetPrimitiveArrayCritical(env, raslineh, 0); \
  62     if (rasline == 0) \
  63         goto out_of_memory; \
  64     block = (unsigned char *) \
  65         (*env)->GetPrimitiveArrayCritical(env, blockh, 0); \
  66     if (block == 0) \
  67         goto out_of_memory
  68 
  69 /*
  70  * Note that it is important to check whether the arrays are NULL,
  71  * because GetPrimitiveArrayCritical might have failed.
  72  */
  73 #define RELEASE_ARRAYS() \
  74 if (prefix) \
  75     (*env)->ReleasePrimitiveArrayCritical(env, prefixh, prefix, 0); \
  76 if (suffix) \
  77     (*env)->ReleasePrimitiveArrayCritical(env, suffixh, suffix, 0); \
  78 if (outCode) \
  79     (*env)->ReleasePrimitiveArrayCritical(env, outCodeh, outCode, 0); \
  80 if (rasline) \
  81     (*env)->ReleasePrimitiveArrayCritical(env, raslineh, rasline, 0); \
  82 if (block) \
  83     (*env)->ReleasePrimitiveArrayCritical(env, blockh, block, 0)
  84 
  85 /* Place holders for the old native interface. */
  86 
  87 long
  88 sun_awt_image_GifImageDecoder_parseImage()
  89 {
  90   return 0;
  91 }
  92 
  93 void
  94 sun_awt_image_GifImageDecoder_initIDs()
  95 {
  96 }
  97 
  98 static jmethodID readID;
  99 static jmethodID sendID;
 100 static jfieldID prefixID;
 101 static jfieldID suffixID;
 102 static jfieldID outCodeID;
 103 
 104 JNIEXPORT void JNICALL
 105 Java_sun_awt_image_GifImageDecoder_initIDs(JNIEnv *env, jclass this)
 106 {
 107     CHECK_NULL(readID = (*env)->GetMethodID(env, this, "readBytes", "([BII)I"));
 108     CHECK_NULL(sendID = (*env)->GetMethodID(env, this, "sendPixels",
 109                                  "(IIII[BLjava/awt/image/ColorModel;)I"));
 110     CHECK_NULL(prefixID = (*env)->GetFieldID(env, this, "prefix", "[S"));
 111     CHECK_NULL(suffixID = (*env)->GetFieldID(env, this, "suffix", "[B"));
 112     CHECK_NULL(outCodeID = (*env)->GetFieldID(env, this, "outCode", "[B"));
 113 }
 114 
 115 JNIEXPORT jboolean JNICALL
 116 Java_sun_awt_image_GifImageDecoder_parseImage(JNIEnv *env,
 117                                               jobject this,
 118                                               jint relx, jint rely,
 119                                               jint width, jint height,
 120                                               jint interlace,
 121                                               jint initCodeSize,
 122                                               jbyteArray blockh,
 123                                               jbyteArray raslineh,
 124                                               jobject cmh)
 125 {
 126     /* Patrick Naughton:
 127      * Note that I ignore the possible existence of a local color map.
 128      * I'm told there aren't many files around that use them, and the
 129      * spec says it's defined for future use.  This could lead to an
 130      * error reading some files.
 131      *
 132      * Start reading the image data. First we get the intial code size
 133      * and compute decompressor constant values, based on this code
 134      * size.
 135      *
 136      * The GIF spec has it that the code size is the code size used to
 137      * compute the above values is the code size given in the file,
 138      * but the code size used in compression/decompression is the code
 139      * size given in the file plus one. (thus the ++).
 140      *
 141      * Arthur van Hoff:
 142      * The following narly code reads LZW compressed data blocks and
 143      * dumps it into the image data. The input stream is broken up into
 144      * blocks of 1-255 characters, each preceded by a length byte.
 145      * 3-12 bit codes are read from these blocks. The codes correspond to
 146      * entry is the hashtable (the prefix, suffix stuff), and the appropriate
 147      * pixels are written to the image.
 148      */
 149     static int verbose = 0;
 150 
 151     int clearCode = (1 << initCodeSize);
 152     int eofCode = clearCode + 1;
 153     int bitMask;
 154     int curCode;
 155     int outCount;
 156 
 157     /* Variables used to form reading data */
 158     int blockEnd = 0;
 159     int remain = 0;
 160     int byteoff = 0;
 161     int accumbits = 0;
 162     int accumdata = 0;
 163 
 164     /* Variables used to decompress the data */
 165     int codeSize = initCodeSize + 1;
 166     int maxCode = 1 << codeSize;
 167     int codeMask = maxCode - 1;
 168     int freeCode = clearCode + 2;
 169     int code = 0;
 170     int oldCode = 0;
 171     unsigned char prevChar = 0;
 172 
 173     /* Temproray storage for decompression */
 174     short *prefix;
 175     unsigned char *suffix = NULL;
 176     unsigned char *outCode = NULL;
 177     unsigned char *rasline = NULL;
 178     unsigned char *block = NULL;
 179 
 180     jshortArray prefixh = (*env)->GetObjectField(env, this, prefixID);
 181     jbyteArray suffixh = (*env)->GetObjectField(env, this, suffixID);
 182     jbyteArray outCodeh = (*env)->GetObjectField(env, this, outCodeID);
 183 
 184     int blockLength = 0;
 185 
 186     /* Variables used for writing pixels */
 187     int x = width;
 188     int y = 0;
 189     int off = 0;
 190     int passinc = interlace ? 8 : 1;
 191     int passht = passinc;
 192     int len;
 193 
 194     /* We have verified the initial code size on the java layer.
 195      * Here we just check bounds for particular indexes. */
 196     if (freeCode >= 4096 || maxCode >= 4096) {
 197         return 0;
 198     }
 199     if (blockh == 0 || raslineh == 0
 200         || prefixh == 0 || suffixh == 0
 201         || outCodeh == 0)
 202     {
 203         JNU_ThrowNullPointerException(env, 0);
 204         return 0;
 205     }
 206     if (((*env)->GetArrayLength(env, prefixh) != 4096) ||
 207         ((*env)->GetArrayLength(env, suffixh) != 4096) ||
 208         ((*env)->GetArrayLength(env, outCodeh) != OUTCODELENGTH))
 209     {
 210         JNU_ThrowArrayIndexOutOfBoundsException(env, 0);
 211         return 0;
 212     }
 213 
 214     if (verbose) {
 215         fprintf(stdout, "Decompressing...");
 216     }
 217 
 218     /* Fix for bugid 4216605 Some animated GIFs display corrupted. */
 219     bitMask = clearCode - 1;
 220 
 221     GET_ARRAYS();
 222 
 223     /* Read codes until the eofCode is encountered */
 224     for (;;) {
 225         if (accumbits < codeSize) {
 226             /* fill the buffer if needed */
 227             while (remain < 2) {
 228                 if (blockEnd) {
 229                     /* Sometimes we have one last byte to process... */
 230                     if (remain == 1 && accumbits + 8 >= codeSize) {
 231                         remain--;
 232                         goto last_byte;
 233                     }
 234                     RELEASE_ARRAYS();
 235                     if (off > 0) {
 236                         (*env)->CallIntMethod(env, this, sendID,
 237                                               relx, rely + y,
 238                                               width, passht,
 239                                               raslineh, cmh);
 240                     }
 241                     /* quietly accept truncated GIF images */
 242                     return 1;
 243                 }
 244                 /* move remaining bytes to the beginning of the buffer */
 245                 block[0] = block[byteoff];
 246                 byteoff = 0;
 247 
 248                 RELEASE_ARRAYS();
 249                 /* fill the block */
 250                 len = (*env)->CallIntMethod(env, this, readID,
 251                                             blockh, remain, blockLength + 1);
 252                 if (len > blockLength + 1) len = blockLength + 1;
 253                 if ((*env)->ExceptionOccurred(env)) {
 254                     return 0;
 255                 }
 256                 GET_ARRAYS();
 257 
 258                 remain += blockLength;
 259                 if (len > 0) {
 260                     remain -= (len - 1);
 261                     blockLength = 0;
 262                 } else {
 263                     blockLength = block[remain];
 264                 }
 265                 if (blockLength == 0) {
 266                     blockEnd = 1;
 267                 }
 268             }
 269             remain -= 2;
 270 
 271             /* 2 bytes at a time saves checking for accumbits < codeSize.
 272              * We know we'll get enough and also that we can't overflow
 273              * since codeSize <= 12.
 274              */
 275             accumdata += (block[byteoff++] & 0xff) << accumbits;
 276             accumbits += 8;
 277         last_byte:
 278             accumdata += (block[byteoff++] & 0xff) << accumbits;
 279             accumbits += 8;
 280         }
 281 
 282         /* Compute the code */
 283         code = accumdata & codeMask;
 284         accumdata >>= codeSize;
 285         accumbits -= codeSize;
 286 
 287         /*
 288          * Interpret the code
 289          */
 290         if (code == clearCode) {
 291             /* Clear code sets everything back to its initial value, then
 292              * reads the immediately subsequent code as uncompressed data.
 293              */
 294             if (verbose) {
 295                 RELEASE_ARRAYS();
 296                 fprintf(stdout, ".");
 297                 fflush(stdout);
 298                 GET_ARRAYS();
 299             }
 300 
 301             /* Note that freeCode is one less than it is supposed to be,
 302              * this is because it will be incremented next time round the loop
 303              */
 304             freeCode = clearCode + 1;
 305             codeSize = initCodeSize + 1;
 306             maxCode = 1 << codeSize;
 307             codeMask = maxCode - 1;
 308 
 309             /* Continue if we've NOT reached the end, some Gif images
 310              * contain bogus codes after the last clear code.
 311              */
 312             if (y < height) {
 313                 continue;
 314             }
 315 
 316             /* pretend we've reached the end of the data */
 317             code = eofCode;
 318         }
 319 
 320         if (code == eofCode) {
 321             /* make sure we read the whole block of pixels. */
 322         flushit:
 323             while (!blockEnd) {
 324                 RELEASE_ARRAYS();
 325                 if (verbose) {
 326                     fprintf(stdout, "flushing %d bytes\n", blockLength);
 327                 }
 328                 if ((*env)->CallIntMethod(env, this, readID,
 329                                           blockh, 0, blockLength + 1) != 0
 330                     || (*env)->ExceptionOccurred(env))
 331                 {
 332                     /* quietly accept truncated GIF images */
 333                     return (!(*env)->ExceptionOccurred(env));
 334                 }
 335                 GET_ARRAYS();
 336                 blockLength = block[blockLength];
 337                 blockEnd = (blockLength == 0);
 338             }
 339             RELEASE_ARRAYS();
 340             return 1;
 341         }
 342 
 343         /* It must be data: save code in CurCode */
 344         curCode = code;
 345         outCount = OUTCODELENGTH;
 346 
 347         /* If greater or equal to freeCode, not in the hash table
 348          * yet; repeat the last character decoded
 349          */
 350         if (curCode >= freeCode) {
 351             if (curCode > freeCode) {
 352                 /*
 353                  * if we get a code too far outside our range, it
 354                  * could case the parser to start traversing parts
 355                  * of our data structure that are out of range...
 356                  */
 357                 goto flushit;
 358             }
 359             curCode = oldCode;
 360             outCode[--outCount] = prevChar;
 361         }
 362 
 363         /* Unless this code is raw data, pursue the chain pointed
 364          * to by curCode through the hash table to its end; each
 365          * code in the chain puts its associated output code on
 366          * the output queue.
 367          */
 368          while (curCode > bitMask) {
 369              outCode[--outCount] = suffix[curCode];
 370              if (outCount == 0) {
 371                  /*
 372                   * In theory this should never happen since our
 373                   * prefix and suffix arrays are monotonically
 374                   * decreasing and so outCode will only be filled
 375                   * as much as those arrays, but I don't want to
 376                   * take that chance and the test is probably
 377                   * cheap compared to the read and write operations.
 378                   * If we ever do overflow the array, we will just
 379                   * flush the rest of the data and quietly accept
 380                   * the GIF as truncated here.
 381                   */
 382                  goto flushit;
 383              }
 384              curCode = prefix[curCode];
 385          }
 386 
 387         /* The last code in the chain is treated as raw data. */
 388         prevChar = (unsigned char)curCode;
 389         outCode[--outCount] = prevChar;
 390 
 391         /* Now we put the data out to the Output routine. It's
 392          * been stacked LIFO, so deal with it that way...
 393          *
 394          * Note that for some malformed images we have to skip
 395          * current frame and continue with rest of data
 396          * because we may have not enough info to interpret
 397          * corrupted frame correctly.
 398          * However, we can not skip frame without decoding it
 399          * and therefore we have to continue looping through data
 400          * but skip internal output loop.
 401          *
 402          * In particular this is possible when
 403          * width of the frame is set to zero. If
 404          * global width (i.e. width of the logical screen)
 405          * is zero too then zero-length scanline buffer
 406          * is allocated in java code and we have no buffer to
 407          * store decoded data in.
 408          */
 409         len = OUTCODELENGTH - outCount;
 410         while ((width > 0) && (--len >= 0)) {
 411             rasline[off++] = outCode[outCount++];
 412 
 413             /* Update the X-coordinate, and if it overflows, update the
 414              * Y-coordinate
 415              */
 416             if (--x == 0) {
 417                 /* If a non-interlaced picture, just increment y to the next
 418                  * scan line.  If it's interlaced, deal with the interlace as
 419                  * described in the GIF spec.  Put the decoded scan line out
 420                  * to the screen if we haven't gone past the bottom of it
 421                  */
 422                 int count;
 423                 RELEASE_ARRAYS();
 424                 count = (*env)->CallIntMethod(env, this, sendID,
 425                                               relx, rely + y,
 426                                               width, passht,
 427                                               raslineh, cmh);
 428                 if (count <= 0 || (*env)->ExceptionOccurred(env)) {
 429                     /* Nobody is listening any more. */
 430                     if (verbose) {
 431                         fprintf(stdout, "Orphan gif decoder quitting\n");
 432                     }
 433                     return 0;
 434                 }
 435                 GET_ARRAYS();
 436                 x = width;
 437                 off = 0;
 438                 /*  pass        inc     ht      ystart */
 439                 /*   0           8      8          0   */
 440                 /*   1           8      4          4   */
 441                 /*   2           4      2          2   */
 442                 /*   3           2      1          1   */
 443                 y += passinc;
 444                 while (y >= height) {
 445                     passinc = passht;
 446                     passht >>= 1;
 447                     y = passht;
 448                     if (passht == 0) {
 449                         goto flushit;
 450                     }
 451                 }
 452             }
 453         }
 454 
 455         /* Build the hash table on-the-fly. No table is stored in the file. */
 456         prefix[freeCode] = (short)oldCode;
 457         suffix[freeCode] = prevChar;
 458         oldCode = code;
 459 
 460         /* Point to the next slot in the table.  If we exceed the
 461          * maxCode, increment the code size unless
 462          * it's already 12.  If it is, do nothing: the next code
 463          * decompressed better be CLEAR
 464          */
 465         if (++freeCode >= maxCode) {
 466             if (codeSize < 12) {
 467                 codeSize++;
 468                 maxCode <<= 1;
 469                 codeMask = maxCode - 1;
 470             } else {
 471                 /* Just in case */
 472                 freeCode = maxCode - 1;
 473             }
 474         }
 475     }
 476 out_of_memory:
 477     RELEASE_ARRAYS();
 478     return 0;
 479 }