2006/8/10, Jimmy, Jing Lv <[EMAIL PROTECTED]>:
<snip> >> >> I've looked into this, I feel puzzled, the stack trace shows that: >> org.apache.harmony.luni.net.SocketOutputStream.write( SocketOutputStream.java:89) >> >> but there are checks for overflow: >> if (0 <= offset && offset <= buffer.length && 0 <= count >> && count <= buffer.length - offset){ >> ... >> } > > Oops, this is certainly wrong: "offset <= buffer.length","count <= > buffer.length - offset", the equal mark should be omitted. > I do some further study and test then, and find the problem was not so easy. Alex and I are correct that "offset <= buffer.length" here is wrong, but the next "count <= buffer.length - offset" seems has proved its correctness. I have a test[1], try to write(new byte[count],count, 0) to a SocketOutputStream, the test passes quietly. I do this test on WinXp Sp2, the latest Harmony workspace, with J9 VM5. I believe the ArrayIndexOutOfBoundsException is throw out when it try to get byte array in the native (GetByteArrayRegion), which is a JNI method. I guess there may be some difference between VMs. Martin, are you using DRLVM? Can someone using DRLVM (or other VMs) run the test below on DRLVM for me? Thanks! [1] public void test_socketOutputStream() throws Exception { ServerSocket ss = new ServerSocket(0); Socket sock = new Socket(); sock.connect(new InetSocketAddress (InetAddress.getLocalHost(),ss.getLocalPort())); ss.accept(); OutputStream os = sock.getOutputStream(); os.write(new byte[0], 0, 0); // passes here os.write(new byte[512], 512, 0); // passes here }
I've run on DRLVM, and get exactly the same exception: java.lang.ArrayIndexOutOfBoundsException: 0..0 So VMs are different here: J9 VM return 0 immediately while DRLVM throw exception. RI return gracefully here, so I think this is a bug , and there're two ways to solve the problem: fix it in java or fix it in VM. I can fix it right now in Java, there may be a lot code like this. And I'm wonderring what RI do in its JNI. I'll test RI's JNI method "GetByteArrayRegion" to see what do it do if pass (new byte[512], 512, 0) as parameter.
I'll raise a JIRA for this. > > I'm not sure if this is the cause of the problem. So would you please > try again if I correct it? :) > >> So can you give more information? e.g, what are PrintWriter try to >> write that time? :) >> >>> 2.- Trying to generate charts using JFreeCharts (server-side): >>> >>> java.lang.NoClassDefFoundError: org/apache/harmony/awt/gl/ImageSurface >>> at >>> java.awt.image.BufferedImage.createImageSurface(BufferedImage.java :659) >>> at java.awt.image.BufferedImage.<init>(BufferedImage.java:352) >>> at >>> org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java:1211) >>> at >>> org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java:1193) >>> at >>> org.jfree.chart.JFreeChart.createBufferedImage(JFreeChart.java :1178)... >>> >>> The JDBC related code is running fine, performance also looks very good. >>> >>> I will contact Winstone developer to see if he can help in some way to >>> identify the problem. He already helped me a few months ago to help >>> identify a bug in GNU Classpath server socket API. >>> >>> Regards, >>> Martin >> >> > > -- Best Regards! Jimmy, Jing Lv China Software Development Lab, IBM --------------------------------------------------------------------- Terms of use : http://incubator.apache.org/harmony/mailing.html To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- Best Regards! Jimmy, Jing Lv China Software Development Lab, IBM