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
This commit is contained in:
Tom Tromey 2002-11-16 00:41:32 +00:00 committed by Tom Tromey
parent 6368a49321
commit 401d536248
2 changed files with 28 additions and 15 deletions

View File

@ -1,3 +1,10 @@
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

View File

@ -1,5 +1,5 @@
/* 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
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.