[vmkit-commits] [vmkit] r145391 - /vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc

Will Dietz wdietz2 at illinois.edu
Mon Nov 28 23:52:08 PST 2011


Author: wdietz2
Date: Tue Nov 29 01:52:07 2011
New Revision: 145391

URL: http://llvm.org/viewvc/llvm-project?rev=145391&view=rev
Log:
Robustify JVM_SetArrayElement and JVM_NewMultiArray (OpenJDK)

Passes mauve's reflect/Array tests.

Modified:
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=145391&r1=145390&r2=145391&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Tue Nov 29 01:52:07 2011
@@ -958,8 +958,25 @@
   llvm_gcroot(element, 0);
 
   BEGIN_JNI_EXCEPTION
+  verifyNull(arr);
   array = *(ArrayObject**)arr;
-  element = *(JavaObject**)val;
+  element = val ? *(JavaObject**)val : NULL;
+
+  Jnjvm* vm = th->getJVM();
+
+  // Verify this is, in fact, an array
+  UserCommonClass * cl = JavaObject::getClass(array);
+  if (!cl || !cl->isArray())
+    vm->illegalArgumentException("Invalid object, expected array");
+
+  // Bounds check
+  if (index < 0 || index >= ArrayObject::getSize(array))
+    vm->indexOutOfBounds(array, index);
+
+  // Check the object is of the correct type
+  UserCommonClass * base = cl->asArrayClass()->baseClass();
+  if (element && !JavaObject::instanceOf(element, base))
+    vm->illegalArgumentException("Wrong object for array type");
 
   ArrayObject::setElement(array, element, index);
 
@@ -1043,12 +1060,12 @@
 
   Jnjvm* vm = th->getJVM();
 
+  verifyNull(eltClass);
+  verifyNull(_dim);
+
   eltClassObj = *(JavaObjectClass**)eltClass;
   dim = *(ArraySInt32**)_dim;
 
-  verifyNull(eltClassObj);
-  verifyNull(dim);
-
   int dim_len = ArraySInt32::getSize(dim);
   if(dim_len <= 0 || dim_len > 255) {
     vm->illegalArgumentException("Too many dimensions for array");





More information about the vmkit-commits mailing list