Changeset 3999


Ignore:
Timestamp:
05/05/08 12:05:18 (12 years ago)
Author:
melissa
Message:

Fixed ArrayIndexOutOfBounds exceptions and applied patch from John Hansen.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/DicomReader.java

    r3854 r3999  
    170170      PackbitsCodec codec = new PackbitsCodec(); 
    171171      byte[] t = codec.decompress(b, new Integer(bytes)); 
     172      if (t.length < bytes) { 
     173        byte[] tmp = t; 
     174        t = new byte[bytes]; 
     175        System.arraycopy(tmp, 0, t, 0, tmp.length); 
     176      } 
    172177 
    173178      if (bpp > 1) { 
     
    193198      for (int c=0; c<ec; c++) { 
    194199        for (int row=0; row<h; row++) { 
    195           System.arraycopy(t, c * srcPlane + (row + y) * srcRowLen + x * bpp, 
    196             buf, h * rowLen * c + row * rowLen, rowLen); 
     200          int src = c * srcPlane + (row + y) * srcRowLen + x * bpp; 
     201          int dest = h * rowLen * c + row * rowLen; 
     202          int len = (int) Math.min(rowLen, t.length - src - 1); 
     203          if (len < 0) break; 
     204          System.arraycopy(t, src, buf, dest, len); 
    197205        } 
    198206      } 
     
    471479          new PackbitsCodec().decompress(in, new Integer(plane)); 
    472480        } 
    473         in.skipBytes(67); 
     481        in.skipBytes(i == 0 ? 78 : 67); 
    474482        while (in.read() == 0); 
    475483        offsets[i] = in.getFilePointer() - 1; 
     
    698706  } 
    699707 
    700   private int getLength() throws IOException { 
     708  private int getLength(int tag) throws IOException { 
    701709    byte[] b = new byte[4]; 
    702710    in.read(b); 
     
    746754      case QQ: 
    747755        // Explicit VR with 16-bit length 
     756        if (tag == 0x00283006) { 
     757                  return DataTools.bytesToInt(b, 2, 2, core.littleEndian[0]); 
     758        } 
    748759        int n1 = DataTools.bytesToShort(b, 2, 2, core.littleEndian[0]); 
    749760        int n2 = DataTools.bytesToShort(b, 2, 2, !core.littleEndian[0]); 
     
    766777    int tag = ((groupWord << 16) & 0xffff0000) | (elementWord & 0xffff); 
    767778 
    768     if (groupWord == 0x7fe0 && (isRLE || isJPEG)) { 
    769       in.skipBytes(20); 
    770     } 
    771  
    772     elementLength = getLength(); 
     779    elementLength = getLength(tag); 
    773780 
    774781    if (elementLength == 0 && groupWord == 0x7fe0) { 
    775       elementLength = getLength(); 
     782      elementLength = getLength(tag); 
    776783    } 
    777784 
Note: See TracChangeset for help on using the changeset viewer.