Commit 401d5362 by Tom Tromey Committed by Tom Tromey

For PR libgcj/8593:

	* java/util/zip/GZIPInputStream.java (read): Check file size.
	Look in inflater for remaining input bytes.
	(read4): Added buf and offset arguments.

From-SVN: r59145
parent 6368a493
2002-11-15 Tom Tromey <tromey@redhat.com>
For PR libgcj/8593:
* java/util/zip/GZIPInputStream.java (read): Check file size.
Look in inflater for remaining input bytes.
(read4): Added buf and offset arguments.
2002-11-12 Eric Blake <ebb9@email.byu.edu> 2002-11-12 Eric Blake <ebb9@email.byu.edu>
* java/applet/AppletContext.java: Fix typo and remove redundant * java/applet/AppletContext.java: Fix typo and remove redundant
......
/* GZIPInputStream.java - Input filter for reading gzip file /* GZIPInputStream.java - Input filter for reading gzip file
Copyright (C) 1999, 2000 Free Software Foundation, Inc. Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath. This file is part of GNU Classpath.
...@@ -141,28 +141,34 @@ public class GZIPInputStream extends InflaterInputStream ...@@ -141,28 +141,34 @@ public class GZIPInputStream extends InflaterInputStream
if (r == -1) if (r == -1)
{ {
eos = true; eos = true;
int header_crc = read4 ();
byte[] tmp = new byte[8];
// First copy remaining bytes from inflater input buffer.
int avail = inf.getRemaining ();
System.arraycopy (this.buf, this.len - avail, tmp, 0, avail);
// Now read remaining bytes from wrapped input stream.
for (int i = avail; i < 8; ++i)
{
tmp[i] = (byte) eof_read ();
}
int header_crc = read4 (tmp, 0);
if (crc.getValue() != header_crc) if (crc.getValue() != header_crc)
throw new ZipException ("corrupted gzip file"); throw new ZipException ("corrupted gzip file - crc mismatch");
// Read final `ISIZE' field. int isize = read4 (tmp, 4);
// FIXME: should we check this length? if (inf.getTotalOut() != isize)
read4 (); throw new ZipException ("corrupted gzip file - size mismatch");
return -1; return -1;
} }
crc.update(buf, off, r); crc.update(buf, off, r);
return r; return r;
} }
private final int read4 () throws IOException private final int read4 (byte[] buf, int offset) throws IOException
{ {
int byte0 = in.read(); return (((buf[offset + 3] & 0xFF) << 24) + ((buf[offset + 2] & 0xFF) << 16)
int byte1 = in.read(); + ((buf[offset + 1] & 0xFF) << 8) + (buf[offset] & 0xFF));
int byte2 = in.read();
int byte3 = in.read();
if (byte3 < 0)
throw new ZipException (".zip archive ended prematurely");
return ((byte3 & 0xFF) << 24) + ((byte2 & 0xFF) << 16)
+ ((byte1 & 0xFF) << 8) + (byte0 & 0xFF);
} }
// Checksum used by this input stream. // Checksum used by this input stream.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment