The affected files are
/trunk/engine/src/desktop/com/jme3/cursors/plugins/CursorLoader.java
and
/branches/gradle-restructure/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java
Here are the diffs:
--- Base (BASE)
+++ Locally Modified (Based On LOCAL)
@@ -41,6 +41,7 @@
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.IOException;
@@ -210,13 +211,13 @@
}
} else if (isIco) {
DataInputStream in = new DataInputStream(inStream);
- int bytesToRead;
- while ((bytesToRead = in.available()) != 0) {
- byte[] icoimage2 = new byte[icoimages.length + bytesToRead];
- System.arraycopy(icoimages, 0, icoimage2, 0, icoimages.length);
- in.read(icoimage2, icoimages.length, bytesToRead);
- icoimages = icoimage2;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ byte[] buffer = new byte[16384];
+ int bytesRead;
+ while ((bytesRead = in.read(buffer)) >= 0) {
+ out.write(buffer, 0, bytesRead);
}
+ icoimages = out.toByteArray();
}
BufferedImage bi[] = parseICOImage(icoimages);
I’ve tested the fix, and it seems to work. Do I have permission to commit this?
For future travelers, if ever you find yourself calling InputStream.available() then you are probably doing it wrong. It’s a very common mistake, though.
@pspeed said:
For future travelers, if ever you find yourself calling InputStream.available() then you are probably doing it wrong. It's a very common mistake, though.
That hint pointed me to the following probable bugs in jME3:
BlenderInputStream.java line 77: size = inputStream.available();
GZIPSerializer line 67: while (in.available() > 0 && ((read = in.read(tmp)) > 0)) {
ZIPSerializer line 69: while (in.available() > 0 && ((read = in.read(tmp)) > 0)) {
I’d appreciate it if someone else would look at these and let me know if they’re real issues.