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

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: Follow review 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 8295c5eed3202d0a3efa2a81b6adbecdce7f280a..bb11efd35d2007e0a171b61105fbddf63a762d67 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) {
@@ -195,12 +210,12 @@ public class Decoder {
/**
* Deserializes an array of boolean at the given offset.
*/
- public boolean[] readBooleans(int offset) {
+ public boolean[] readBooleans(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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);
@@ -219,12 +234,12 @@ public class Decoder {
/**
* Deserializes an array of bytes at the given offset.
*/
- public byte[] readBytes(int offset) {
+ public byte[] readBytes(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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);
@@ -234,12 +249,12 @@ public class Decoder {
/**
* Deserializes an array of shorts at the given offset.
*/
- public short[] readShorts(int offset) {
+ public short[] readShorts(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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);
@@ -249,12 +264,12 @@ public class Decoder {
/**
* Deserializes an array of ints at the given offset.
*/
- public int[] readInts(int offset) {
+ public int[] readInts(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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);
@@ -264,12 +279,12 @@ public class Decoder {
/**
* Deserializes an array of floats at the given offset.
*/
- public float[] readFloats(int offset) {
+ public float[] readFloats(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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);
@@ -279,12 +294,12 @@ public class Decoder {
/**
* Deserializes an array of longs at the given offset.
*/
- public long[] readLongs(int offset) {
+ public long[] readLongs(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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);
@@ -294,12 +309,12 @@ public class Decoder {
/**
* Deserializes an array of doubles at the given offset.
*/
- public double[] readDoubles(int offset) {
+ public double[] readDoubles(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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);
@@ -358,8 +373,7 @@ public class Decoder {
*
* @return a proxy to the service.
*/
- public <P extends Proxy> P readServiceInterface(int offset,
- Interface.Manager<?, P> manager) {
+ public <P extends Proxy> P readServiceInterface(int offset, Interface.Manager<?, P> manager) {
MessagePipeHandle handle = readMessagePipeHandle(offset);
if (!handle.isValid()) {
return null;
@@ -382,7 +396,7 @@ public class Decoder {
* Deserializes a string at the given offset.
*/
public String readString(int offset) {
- byte[] bytes = readBytes(offset);
+ byte[] bytes = readBytes(offset, BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
if (bytes == null) {
return null;
}
@@ -392,12 +406,12 @@ public class Decoder {
/**
* Deserializes an array of |Handle| at the given offset.
*/
- public Handle[] readHandles(int offset) {
+ public Handle[] readHandles(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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(
@@ -409,12 +423,12 @@ public class Decoder {
/**
* Deserializes an array of |UntypedHandle| at the given offset.
*/
- public UntypedHandle[] readUntypedHandles(int offset) {
+ public UntypedHandle[] readUntypedHandles(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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(
@@ -426,12 +440,12 @@ public class Decoder {
/**
* Deserializes an array of |ConsumerHandle| at the given offset.
*/
- public DataPipe.ConsumerHandle[] readConsumerHandles(int offset) {
+ public DataPipe.ConsumerHandle[] readConsumerHandles(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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(
@@ -443,12 +457,12 @@ public class Decoder {
/**
* Deserializes an array of |ProducerHandle| at the given offset.
*/
- public DataPipe.ProducerHandle[] readProducerHandles(int offset) {
+ public DataPipe.ProducerHandle[] readProducerHandles(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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(
@@ -461,12 +475,12 @@ public class Decoder {
/**
* Deserializes an array of |MessagePipeHandle| at the given offset.
*/
- public MessagePipeHandle[] readMessagePipeHandles(int offset) {
+ public MessagePipeHandle[] readMessagePipeHandles(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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(
@@ -479,12 +493,12 @@ public class Decoder {
/**
* Deserializes an array of |SharedBufferHandle| at the given offset.
*/
- public SharedBufferHandle[] readSharedBufferHandles(int offset) {
+ public SharedBufferHandle[] readSharedBufferHandles(int offset, int expectedLength) {
Decoder d = readPointer(offset);
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(
@@ -497,13 +511,13 @@ public class Decoder {
/**
* Deserializes an array of |ServiceHandle| at the given offset.
*/
- public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(int offset,
- Interface.Manager<S, P> manager) {
+ public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(
+ int offset, Interface.Manager<S, P> manager, int expectedLength) {
Decoder d = readPointer(offset);
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
@@ -519,12 +533,13 @@ public class Decoder {
/**
* Deserializes an array of |InterfaceRequest| at the given offset.
*/
- public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(int offset) {
+ public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(
+ int offset, int expectedLength) {
Decoder d = readPointer(offset);
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