Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(491)

Unified Diff: mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java

Issue 522653004: mojo: Validate fixed size array for the mojo java bindings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix gn build. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
index 49fb1fdcef0c675f8538b0922d21b5a40ac05c4f..8c69b9219e703314740b4baca1ce11627e1111c7 100644
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
+++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
@@ -128,6 +128,21 @@ public class Decoder {
}
/**
+ * Deserializes a {@link DataHeader} of an array at the given offset.
+ *
+ * @param expectedLength the expected length of the array.
+ */
+ public DataHeader readArrayDataHeader(int expectedLength) {
+ DataHeader dataHeader = readDataHeader();
+ if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
+ && dataHeader.numFields != expectedLength) {
+ throw new DeserializationException("Incorrect array length. Expected: " +
+ expectedLength + ", but got: " + dataHeader.numFields + ".");
+ }
+ return dataHeader;
+ }
+
+ /**
* Deserializes a byte at the given offset.
*/
public byte readByte(int offset) {
@@ -199,12 +214,12 @@ public class Decoder {
/**
* Deserializes an array of boolean at the given offset.
*/
- public boolean[] readBooleans(int offset, int arrayNullability) {
+ public boolean[] readBooleans(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
byte[] bytes = new byte[si.numFields + 7 / BindingsHelper.ALIGNMENT];
d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
d.mMessage.buffer.get(bytes);
@@ -223,12 +238,12 @@ public class Decoder {
/**
* Deserializes an array of bytes at the given offset.
*/
- public byte[] readBytes(int offset, int arrayNullability) {
+ public byte[] readBytes(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
byte[] result = new byte[si.numFields];
d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
d.mMessage.buffer.get(result);
@@ -238,12 +253,12 @@ public class Decoder {
/**
* Deserializes an array of shorts at the given offset.
*/
- public short[] readShorts(int offset, int arrayNullability) {
+ public short[] readShorts(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
short[] result = new short[si.numFields];
d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
d.mMessage.buffer.asShortBuffer().get(result);
@@ -253,12 +268,12 @@ public class Decoder {
/**
* Deserializes an array of ints at the given offset.
*/
- public int[] readInts(int offset, int arrayNullability) {
+ public int[] readInts(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
int[] result = new int[si.numFields];
d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
d.mMessage.buffer.asIntBuffer().get(result);
@@ -268,12 +283,12 @@ public class Decoder {
/**
* Deserializes an array of floats at the given offset.
*/
- public float[] readFloats(int offset, int arrayNullability) {
+ public float[] readFloats(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
float[] result = new float[si.numFields];
d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
d.mMessage.buffer.asFloatBuffer().get(result);
@@ -283,12 +298,12 @@ public class Decoder {
/**
* Deserializes an array of longs at the given offset.
*/
- public long[] readLongs(int offset, int arrayNullability) {
+ public long[] readLongs(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
long[] result = new long[si.numFields];
d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
d.mMessage.buffer.asLongBuffer().get(result);
@@ -298,12 +313,12 @@ public class Decoder {
/**
* Deserializes an array of doubles at the given offset.
*/
- public double[] readDoubles(int offset, int arrayNullability) {
+ public double[] readDoubles(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
double[] result = new double[si.numFields];
d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
d.mMessage.buffer.asDoubleBuffer().get(result);
@@ -392,7 +407,7 @@ public class Decoder {
*/
public String readString(int offset, boolean nullable) {
final int arrayNullability = nullable ? BindingsHelper.ARRAY_NULLABLE : 0;
- byte[] bytes = readBytes(offset, arrayNullability);
+ byte[] bytes = readBytes(offset, arrayNullability, BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
if (bytes == null) {
return null;
}
@@ -402,12 +417,12 @@ public class Decoder {
/**
* Deserializes an array of |Handle| at the given offset.
*/
- public Handle[] readHandles(int offset, int arrayNullability) {
+ public Handle[] readHandles(int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
Handle[] result = new Handle[si.numFields];
for (int i = 0; i < result.length; ++i) {
result[i] = d.readHandle(
@@ -420,12 +435,13 @@ public class Decoder {
/**
* Deserializes an array of |UntypedHandle| at the given offset.
*/
- public UntypedHandle[] readUntypedHandles(int offset, int arrayNullability) {
+ public UntypedHandle[] readUntypedHandles(
+ int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
UntypedHandle[] result = new UntypedHandle[si.numFields];
for (int i = 0; i < result.length; ++i) {
result[i] = d.readUntypedHandle(
@@ -438,12 +454,13 @@ public class Decoder {
/**
* Deserializes an array of |ConsumerHandle| at the given offset.
*/
- public DataPipe.ConsumerHandle[] readConsumerHandles(int offset, int arrayNullability) {
+ public DataPipe.ConsumerHandle[] readConsumerHandles(
+ int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
DataPipe.ConsumerHandle[] result = new DataPipe.ConsumerHandle[si.numFields];
for (int i = 0; i < result.length; ++i) {
result[i] = d.readConsumerHandle(
@@ -456,12 +473,13 @@ public class Decoder {
/**
* Deserializes an array of |ProducerHandle| at the given offset.
*/
- public DataPipe.ProducerHandle[] readProducerHandles(int offset, int arrayNullability) {
+ public DataPipe.ProducerHandle[] readProducerHandles(
+ int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
DataPipe.ProducerHandle[] result = new DataPipe.ProducerHandle[si.numFields];
for (int i = 0; i < result.length; ++i) {
result[i] = d.readProducerHandle(
@@ -475,12 +493,13 @@ public class Decoder {
/**
* Deserializes an array of |MessagePipeHandle| at the given offset.
*/
- public MessagePipeHandle[] readMessagePipeHandles(int offset, int arrayNullability) {
+ public MessagePipeHandle[] readMessagePipeHandles(
+ int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
MessagePipeHandle[] result = new MessagePipeHandle[si.numFields];
for (int i = 0; i < result.length; ++i) {
result[i] = d.readMessagePipeHandle(
@@ -494,12 +513,13 @@ public class Decoder {
/**
* Deserializes an array of |SharedBufferHandle| at the given offset.
*/
- public SharedBufferHandle[] readSharedBufferHandles(int offset, int arrayNullability) {
+ public SharedBufferHandle[] readSharedBufferHandles(
+ int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
SharedBufferHandle[] result = new SharedBufferHandle[si.numFields];
for (int i = 0; i < result.length; ++i) {
result[i] = d.readSharedBufferHandle(
@@ -513,13 +533,13 @@ public class Decoder {
/**
* Deserializes an array of |ServiceHandle| at the given offset.
*/
- public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(int offset,
- int arrayNullability, Interface.Manager<S, P> manager) {
+ public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(
+ int offset, int arrayNullability, int expectedLength, Interface.Manager<S, P> manager) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
S[] result = manager.buildArray(si.numFields);
for (int i = 0; i < result.length; ++i) {
// This cast is necessary because java 6 doesn't handle wildcard correctly when using
@@ -536,13 +556,13 @@ public class Decoder {
/**
* Deserializes an array of |InterfaceRequest| at the given offset.
*/
- public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(int offset,
- int arrayNullability) {
+ public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(
+ int offset, int arrayNullability, int expectedLength) {
Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeader();
+ DataHeader si = d.readArrayDataHeader(expectedLength);
@SuppressWarnings("unchecked")
InterfaceRequest<I>[] result = new InterfaceRequest[si.numFields];
for (int i = 0; i < result.length; ++i) {

Powered by Google App Engine
This is Rietveld 408576698