OSDN Git Service

[Renderscript] Add check for Allocation.copyTo(Array) and
authorMiao Wang <miaowang@google.com>
Thu, 15 Jan 2015 19:09:23 +0000 (11:09 -0800)
committerMiao Wang <miaowang@google.com>
Wed, 21 Jan 2015 21:17:19 +0000 (21:17 +0000)
Fix the input allocation type check for Histogram Intrinsic.

Bug: 19035242
Change-Id: I0ef2672bf816854db90fc92dc9ef51d1d231c246

rs/java/android/renderscript/Allocation.java
rs/java/android/renderscript/ScriptIntrinsicHistogram.java

index 3cda6de..4e89566 100644 (file)
@@ -1262,6 +1262,10 @@ public class Allocation extends BaseObj {
 
     private void copyTo(Object array, Element.DataType dt, int arrayLen) {
         Trace.traceBegin(RenderScript.TRACE_TAG, "copyTo");
+        if (dt.mSize * arrayLen < mSize) {
+            throw new RSIllegalArgumentException(
+                "Size of output array cannot be smaller than size of allocation.");
+        }
         mRS.validate();
         mRS.nAllocationRead(getID(mRS), array, dt);
         Trace.traceEnd(RenderScript.TRACE_TAG);
index 95b610a..4ecac99 100644 (file)
@@ -91,9 +91,9 @@ public final class ScriptIntrinsicHistogram extends ScriptIntrinsic {
             throw new RSIllegalArgumentException(
                 "Input vector size must be >= output vector size.");
         }
-        if (ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
-            ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
-            throw new RSIllegalArgumentException("Output type must be U32 or I32.");
+        if (!ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
+            !ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
+            throw new RSIllegalArgumentException("Input type must be U8 or U8_4.");
         }
 
         forEach(0, ain, null, null, opt);
@@ -187,9 +187,9 @@ public final class ScriptIntrinsicHistogram extends ScriptIntrinsic {
         if (mOut.getType().getElement().getVectorSize() != 1) {
             throw new RSIllegalArgumentException("Output vector size must be one.");
         }
-        if (ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
-            ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
-            throw new RSIllegalArgumentException("Output type must be U32 or I32.");
+        if (!ain.getType().getElement().isCompatible(Element.U8(mRS)) &&
+            !ain.getType().getElement().isCompatible(Element.U8_4(mRS))) {
+            throw new RSIllegalArgumentException("Input type must be U8 or U8_4.");
         }
 
         forEach(1, ain, null, null, opt);