--- old/src/share/classes/java/io/BufferedInputStream.java Wed Nov 17 17:42:09 2010 +++ new/src/share/classes/java/io/BufferedInputStream.java Wed Nov 17 17:42:09 2010 @@ -395,7 +395,11 @@ * or an I/O error occurs. */ public synchronized int available() throws IOException { - return getInIfOpen().available() + (count - pos); + int n = count - pos; + int avail = getInIfOpen().available(); + return n > (Integer.MAX_VALUE - avail) + ? Integer.MAX_VALUE + : n + avail; } /** --- old/src/share/classes/java/io/PushbackInputStream.java Wed Nov 17 17:42:10 2010 +++ new/src/share/classes/java/io/PushbackInputStream.java Wed Nov 17 17:42:10 2010 @@ -273,7 +273,11 @@ */ public int available() throws IOException { ensureOpen(); - return (buf.length - pos) + super.available(); + int n = buf.length - pos; + int avail = super.available(); + return n > (Integer.MAX_VALUE - avail) + ? Integer.MAX_VALUE + : n + avail; } /** --- old/src/windows/native/java/io/io_util_md.c Wed Nov 17 17:42:12 2010 +++ new/src/windows/native/java/io/io_util_md.c Wed Nov 17 17:42:11 2010 @@ -335,10 +335,11 @@ return FALSE; } current = (((jlong)highPos) << 32) | lowPos; - end = GetFileSize(h, &sizeHigh); + sizeLow = GetFileSize(h, &sizeHigh); if (sizeLow == ((DWORD)-1)) { return FALSE; } + end = (((jlong)sizeHigh) << 32) | sizeLow; *pbytes = end - current; return TRUE; }