FULL PRODUCT VERSION : java version "1.6.0_29" Java(TM) SE Runtime Environment (build 1.6.0_29-b11) Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows [Version 6.1.7601] A DESCRIPTION OF THE PROBLEM : There is an issue with the BufferedInputStream when used with large inputstreams and using mark where the fill() method will calculate a negative size and throw a NegativeArraySizeException java.lang.NegativeArraySizeException at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read1(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source). REGRESSION. Last worked in version 6u29 STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : 1. Open a large inputstream such as a file. ( My repro used a 3600 MB file) 2. Use a buffered inputstream to read the file 3. call mark 4. Copy the entire stream to another outputstream exception will be thrown in BufferedInputStream.fill() EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - File copy works correctly. ACTUAL - java.lang.NegativeArraySizeException at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read1(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) ERROR MESSAGES/STACK TRACES THAT OCCUR : java.lang.NegativeArraySizeException at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read1(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- // Note my input file was 3.6 Gbs for this repro. InputStream buffStream = new BufferedInputStream(new FileInputStream(f)); FileOutputStream outStream = new FileOutputStream(other); // Mark sourceStream for current position. buffStream.mark(Integer.MAX_VALUE); try { int count = -1; long total = 0; final byte[] retrievedBuff = new byte[8 * 1024]; count = buffStream.read(retrievedBuff, 0, 8 * 1024); while (count != -1) { outStream.write(retrievedBuff, 0, count); total += count; count = buffStream.read(retrievedBuff, 0, 8 * 1024); } } catch (Exception e) { e.printStackTrace(); } buffStream.close(); outStream.close(); ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : Dont use BufferedInputStream :)
|