| Index: third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| index b95b6dd40ea26f7e3afd1180f1e568a7155da96e..fa1eb2366337942de57b43403057981b10438d99 100644
|
| --- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| +++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| @@ -120,22 +120,47 @@ public class Decoder {
|
| // Claim the memory for the header.
|
| mValidator.claimMemory(mBaseOffset, mBaseOffset + DataHeader.HEADER_SIZE);
|
| int size = readInt(DataHeader.SIZE_OFFSET);
|
| - int numFields = readInt(DataHeader.NUM_FIELDS_OFFSET);
|
| + int elementsOrVersion = readInt(DataHeader.ELEMENTS_OR_VERSION_OFFSET);
|
| if (size < 0) {
|
| throw new DeserializationException(
|
| "Negative size. Unsigned integers are not valid for java.");
|
| }
|
| - if (numFields < 0) {
|
| + if (elementsOrVersion < 0) {
|
| throw new DeserializationException(
|
| - "Negative number of fields. Unsigned integers are not valid for java.");
|
| + "Negative elements or version. Unsigned integers are not valid for java.");
|
| }
|
|
|
| // Claim the remaining memory.
|
| mValidator.claimMemory(mBaseOffset + DataHeader.HEADER_SIZE, mBaseOffset + size);
|
| - DataHeader res = new DataHeader(size, numFields);
|
| + DataHeader res = new DataHeader(size, elementsOrVersion);
|
| return res;
|
| }
|
|
|
| + public DataHeader readAndValidateDataHeader(DataHeader[] versionArray) {
|
| + DataHeader header = readDataHeader();
|
| + int maxVersionIndex = versionArray.length - 1;
|
| + if (header.elementsOrVersion <= versionArray[maxVersionIndex].elementsOrVersion) {
|
| + DataHeader referenceHeader = null;
|
| + for (int index = maxVersionIndex; index >= 0; index--) {
|
| + DataHeader dataHeader = versionArray[index];
|
| + if (header.elementsOrVersion >= dataHeader.elementsOrVersion) {
|
| + referenceHeader = dataHeader;
|
| + break;
|
| + }
|
| + }
|
| + if (referenceHeader == null || referenceHeader.size != header.size) {
|
| + throw new DeserializationException(
|
| + "Header doesn't correspond to any known version.");
|
| + }
|
| + } else {
|
| + if (header.size < versionArray[maxVersionIndex].size) {
|
| + throw new DeserializationException("Message newer than the last known version"
|
| + + " cannot be shorter than required by the last known version.");
|
| + }
|
| + }
|
| + return header;
|
| + }
|
| +
|
| /**
|
| * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
|
| * array where element have the given size.
|
| @@ -153,9 +178,9 @@ public class Decoder {
|
| throw new DeserializationException(
|
| "Incorrect header for map. The size is incorrect.");
|
| }
|
| - if (si.numFields != BindingsHelper.MAP_STRUCT_HEADER.numFields) {
|
| + if (si.elementsOrVersion != BindingsHelper.MAP_STRUCT_HEADER.elementsOrVersion) {
|
| throw new DeserializationException(
|
| - "Incorrect header for map. The number of fields is incorrect.");
|
| + "Incorrect header for map. The version is incorrect.");
|
| }
|
| }
|
|
|
| @@ -244,10 +269,10 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForBooleanArray(expectedLength);
|
| - byte[] bytes = new byte[(si.numFields + 7) / BindingsHelper.ALIGNMENT];
|
| + byte[] bytes = new byte[(si.elementsOrVersion + 7) / BindingsHelper.ALIGNMENT];
|
| d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.getData().get(bytes);
|
| - boolean[] result = new boolean[si.numFields];
|
| + boolean[] result = new boolean[si.elementsOrVersion];
|
| for (int i = 0; i < bytes.length; ++i) {
|
| for (int j = 0; j < BindingsHelper.ALIGNMENT; ++j) {
|
| int booleanIndex = i * BindingsHelper.ALIGNMENT + j;
|
| @@ -268,7 +293,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(1, expectedLength);
|
| - byte[] result = new byte[si.numFields];
|
| + byte[] result = new byte[si.elementsOrVersion];
|
| d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.getData().get(result);
|
| return result;
|
| @@ -283,7 +308,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(2, expectedLength);
|
| - short[] result = new short[si.numFields];
|
| + short[] result = new short[si.elementsOrVersion];
|
| d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.getData().asShortBuffer().get(result);
|
| return result;
|
| @@ -298,7 +323,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - int[] result = new int[si.numFields];
|
| + int[] result = new int[si.elementsOrVersion];
|
| d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.getData().asIntBuffer().get(result);
|
| return result;
|
| @@ -313,7 +338,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - float[] result = new float[si.numFields];
|
| + float[] result = new float[si.elementsOrVersion];
|
| d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.getData().asFloatBuffer().get(result);
|
| return result;
|
| @@ -328,7 +353,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(8, expectedLength);
|
| - long[] result = new long[si.numFields];
|
| + long[] result = new long[si.elementsOrVersion];
|
| d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.getData().asLongBuffer().get(result);
|
| return result;
|
| @@ -343,7 +368,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(8, expectedLength);
|
| - double[] result = new double[si.numFields];
|
| + double[] result = new double[si.elementsOrVersion];
|
| d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.getData().asDoubleBuffer().get(result);
|
| return result;
|
| @@ -447,7 +472,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - Handle[] result = new Handle[si.numFields];
|
| + Handle[] result = new Handle[si.elementsOrVersion];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readHandle(
|
| DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| @@ -466,7 +491,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - UntypedHandle[] result = new UntypedHandle[si.numFields];
|
| + UntypedHandle[] result = new UntypedHandle[si.elementsOrVersion];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readUntypedHandle(
|
| DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| @@ -485,7 +510,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - DataPipe.ConsumerHandle[] result = new DataPipe.ConsumerHandle[si.numFields];
|
| + DataPipe.ConsumerHandle[] result = new DataPipe.ConsumerHandle[si.elementsOrVersion];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readConsumerHandle(
|
| DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| @@ -504,7 +529,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - DataPipe.ProducerHandle[] result = new DataPipe.ProducerHandle[si.numFields];
|
| + DataPipe.ProducerHandle[] result = new DataPipe.ProducerHandle[si.elementsOrVersion];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readProducerHandle(
|
| DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| @@ -524,7 +549,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - MessagePipeHandle[] result = new MessagePipeHandle[si.numFields];
|
| + MessagePipeHandle[] result = new MessagePipeHandle[si.elementsOrVersion];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readMessagePipeHandle(
|
| DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| @@ -544,7 +569,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - SharedBufferHandle[] result = new SharedBufferHandle[si.numFields];
|
| + SharedBufferHandle[] result = new SharedBufferHandle[si.elementsOrVersion];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readSharedBufferHandle(
|
| DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| @@ -564,7 +589,7 @@ public class Decoder {
|
| return null;
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - S[] result = manager.buildArray(si.numFields);
|
| + S[] result = manager.buildArray(si.elementsOrVersion);
|
| for (int i = 0; i < result.length; ++i) {
|
| // This cast is necessary because java 6 doesn't handle wildcard correctly when using
|
| // Manager<S, ? extends S>
|
| @@ -588,7 +613,7 @@ public class Decoder {
|
| }
|
| DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| @SuppressWarnings("unchecked")
|
| - InterfaceRequest<I>[] result = new InterfaceRequest[si.numFields];
|
| + InterfaceRequest<I>[] result = new InterfaceRequest[si.elementsOrVersion];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readInterfaceRequest(
|
| DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| @@ -610,13 +635,13 @@ public class Decoder {
|
| */
|
| private DataHeader readDataHeaderForBooleanArray(int expectedLength) {
|
| DataHeader dataHeader = readDataHeader();
|
| - if (dataHeader.size < DataHeader.HEADER_SIZE + (dataHeader.numFields + 7) / 8) {
|
| + if (dataHeader.size < DataHeader.HEADER_SIZE + (dataHeader.elementsOrVersion + 7) / 8) {
|
| throw new DeserializationException("Array header is incorrect.");
|
| }
|
| if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
|
| - && dataHeader.numFields != expectedLength) {
|
| - throw new DeserializationException("Incorrect array length. Expected: "
|
| - + expectedLength + ", but got: " + dataHeader.numFields + ".");
|
| + && dataHeader.elementsOrVersion != expectedLength) {
|
| + throw new DeserializationException("Incorrect array length. Expected: " + expectedLength
|
| + + ", but got: " + dataHeader.elementsOrVersion + ".");
|
| }
|
| return dataHeader;
|
| }
|
| @@ -626,13 +651,14 @@ public class Decoder {
|
| */
|
| private DataHeader readDataHeaderForArray(long elementSize, int expectedLength) {
|
| DataHeader dataHeader = readDataHeader();
|
| - if (dataHeader.size < (DataHeader.HEADER_SIZE + elementSize * dataHeader.numFields)) {
|
| + if (dataHeader.size
|
| + < (DataHeader.HEADER_SIZE + elementSize * dataHeader.elementsOrVersion)) {
|
| throw new DeserializationException("Array header is incorrect.");
|
| }
|
| if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
|
| - && dataHeader.numFields != expectedLength) {
|
| - throw new DeserializationException("Incorrect array length. Expected: "
|
| - + expectedLength + ", but got: " + dataHeader.numFields + ".");
|
| + && dataHeader.elementsOrVersion != expectedLength) {
|
| + throw new DeserializationException("Incorrect array length. Expected: " + expectedLength
|
| + + ", but got: " + dataHeader.elementsOrVersion + ".");
|
| }
|
| return dataHeader;
|
| }
|
|
|