Fixes PR80.
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Fri, 13 Jun 2008 21:02:18 +0000 (23:02 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Fri, 13 Jun 2008 21:02:18 +0000 (23:02 +0200)
* src/vm/builtin.c (builtin_arraycopy): Fixed range checks, cast to
unsigned values.
* tests/regression/bugzilla/All.java (suite): Added PR80.
* tests/regression/bugzilla/PR80.java: New file.

src/vm/builtin.c
tests/regression/bugzilla/All.java
tests/regression/bugzilla/PR80.java [new file with mode: 0644]

index 86ba2e5469a3e06713fa99320f4d0261b315ce6e..85c56f5685ae6daf11baae22c2ca8879b3a0f60f 100644 (file)
@@ -2123,15 +2123,24 @@ void builtin_arraycopy(java_handle_t *src, s4 srcStart,
                return;
        }
 
-       /* we try to throw exception with the same message as SUN does */
+       // Check if offsets and length are positive.
+       if ((srcStart < 0) || (destStart < 0) || (len < 0)) {
+               exceptions_throw_arrayindexoutofboundsexception();
+               return;
+       }
 
-       if ((len < 0) || (srcStart < 0) || (destStart < 0) ||
-               (srcStart  + len < 0) || (srcStart  + len > LLNI_array_size(src)) ||
-               (destStart + len < 0) || (destStart + len > LLNI_array_size(dest))) {
+       // Check if ranges are valid.
+       if ((((uint32_t) srcStart  + (uint32_t) len) > (uint32_t) LLNI_array_size(src)) ||
+               (((uint32_t) destStart + (uint32_t) len) > (uint32_t) LLNI_array_size(dest))) {
                exceptions_throw_arrayindexoutofboundsexception();
                return;
        }
 
+       // Special case.
+       if (len == 0) {
+               return;
+       }
+
        if (sdesc->componentvftbl == ddesc->componentvftbl) {
                /* We copy primitive values or references of exactly the same type */
 
index e5fcac12fcd6a887401a612f84436059f1e2f23e..bdf0898784b074f15e70f54f00517c67a55a80fa 100644 (file)
@@ -48,6 +48,7 @@ public class All extends TestCase {
         suite.addTest(new TestSuite(PR57.class));
         suite.addTest(new TestSuite(PR58.class));
         suite.addTest(new TestSuite(PR65.class));
+        suite.addTest(new TestSuite(PR80.class));
 
         return suite;
     }
diff --git a/tests/regression/bugzilla/PR80.java b/tests/regression/bugzilla/PR80.java
new file mode 100644 (file)
index 0000000..5e6e401
--- /dev/null
@@ -0,0 +1,48 @@
+/* tests/regression/bugzilla/PR80.java
+
+   Copyright (C) 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+*/
+
+
+import junit.framework.*;
+import junit.textui.*;
+
+public class PR80 extends TestCase {
+    public static void main(String[] args) {
+        TestRunner.run(suite());
+    }
+
+    public static Test suite() {
+        return new TestSuite(PR80.class);
+    }
+
+    public void test() {
+        try {
+            // Taken from Mauve gnu.testlet.java.lang.System.arraycopy
+            int[] a = new int[5];
+            int[] b = new int[5];
+            System.arraycopy(a, 4, b, 4, Integer.MAX_VALUE);
+            fail("Should throw ArrayIndexOutOfBoundsException");
+        } catch (ArrayIndexOutOfBoundsException success) {
+        }
+    }
+}