|
|
|
@ -10,6 +10,7 @@ package com.google.protobuf; |
|
|
|
|
import static com.google.common.truth.Truth.assertThat; |
|
|
|
|
import static com.google.common.truth.Truth.assertWithMessage; |
|
|
|
|
import static org.junit.Assert.assertArrayEquals; |
|
|
|
|
import static org.junit.Assert.assertThrows; |
|
|
|
|
import protobuf_unittest.UnittestProto.BoolMessage; |
|
|
|
|
import protobuf_unittest.UnittestProto.Int32Message; |
|
|
|
|
import protobuf_unittest.UnittestProto.Int64Message; |
|
|
|
@ -534,6 +535,86 @@ public class CodedInputStreamTest { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testReadStringWithSizeOverflow_throwsInvalidProtocolBufferException() |
|
|
|
|
throws Exception { |
|
|
|
|
ByteString.Output rawOutput = ByteString.newOutput(); |
|
|
|
|
CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); |
|
|
|
|
|
|
|
|
|
output.writeUInt32NoTag(0xFFFFFFFF); // Larger than Integer.MAX_VALUE.
|
|
|
|
|
output.writeRawBytes(new byte[32]); // Pad with a few random bytes.
|
|
|
|
|
output.flush(); |
|
|
|
|
byte[] data = rawOutput.toByteString().toByteArray(); |
|
|
|
|
for (InputType inputType : InputType.values()) { |
|
|
|
|
CodedInputStream input = inputType.newDecoder(data); |
|
|
|
|
assertThrows(InvalidProtocolBufferException.class, input::readString); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testReadStringRequireUtf8WithSizeOverflow_throwsInvalidProtocolBufferException() |
|
|
|
|
throws Exception { |
|
|
|
|
ByteString.Output rawOutput = ByteString.newOutput(); |
|
|
|
|
CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); |
|
|
|
|
|
|
|
|
|
output.writeUInt32NoTag(0xFFFFFFFF); // Larger than Integer.MAX_VALUE.
|
|
|
|
|
output.writeRawBytes(new byte[32]); // Pad with a few random bytes.
|
|
|
|
|
output.flush(); |
|
|
|
|
byte[] data = rawOutput.toByteString().toByteArray(); |
|
|
|
|
for (InputType inputType : InputType.values()) { |
|
|
|
|
CodedInputStream input = inputType.newDecoder(data); |
|
|
|
|
assertThrows(InvalidProtocolBufferException.class, input::readStringRequireUtf8); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testReadBytesWithHugeSizeOverflow_throwsInvalidProtocolBufferException() |
|
|
|
|
throws Exception { |
|
|
|
|
ByteString.Output rawOutput = ByteString.newOutput(); |
|
|
|
|
CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); |
|
|
|
|
|
|
|
|
|
output.writeUInt32NoTag(0xFFFFFFFF); // Larger than Integer.MAX_VALUE.
|
|
|
|
|
output.writeRawBytes(new byte[32]); // Pad with a few random bytes.
|
|
|
|
|
output.flush(); |
|
|
|
|
byte[] data = rawOutput.toByteString().toByteArray(); |
|
|
|
|
for (InputType inputType : InputType.values()) { |
|
|
|
|
CodedInputStream input = inputType.newDecoder(data); |
|
|
|
|
assertThrows(InvalidProtocolBufferException.class, input::readBytes); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testReadByteArrayWithHugeSizeOverflow_throwsInvalidProtocolBufferException() |
|
|
|
|
throws Exception { |
|
|
|
|
ByteString.Output rawOutput = ByteString.newOutput(); |
|
|
|
|
CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); |
|
|
|
|
|
|
|
|
|
output.writeUInt32NoTag(0xFFFFFFFF); // Larger than Integer.MAX_VALUE.
|
|
|
|
|
output.writeRawBytes(new byte[32]); // Pad with a few random bytes.
|
|
|
|
|
output.flush(); |
|
|
|
|
byte[] data = rawOutput.toByteString().toByteArray(); |
|
|
|
|
for (InputType inputType : InputType.values()) { |
|
|
|
|
CodedInputStream input = inputType.newDecoder(data); |
|
|
|
|
assertThrows(InvalidProtocolBufferException.class, input::readByteArray); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void testReadByteBufferWithSizeOverflow_throwsInvalidProtocolBufferException() |
|
|
|
|
throws Exception { |
|
|
|
|
ByteString.Output rawOutput = ByteString.newOutput(); |
|
|
|
|
CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); |
|
|
|
|
|
|
|
|
|
output.writeUInt32NoTag(0xFFFFFFFF); // Larger than Integer.MAX_VALUE.
|
|
|
|
|
output.writeRawBytes(new byte[32]); // Pad with a few random bytes.
|
|
|
|
|
output.flush(); |
|
|
|
|
byte[] data = rawOutput.toByteString().toByteArray(); |
|
|
|
|
for (InputType inputType : InputType.values()) { |
|
|
|
|
CodedInputStream input = inputType.newDecoder(data); |
|
|
|
|
assertThrows(InvalidProtocolBufferException.class, input::readByteBuffer); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Test we can do messages that are up to CodedInputStream#DEFAULT_SIZE_LIMIT in size (2G or |
|
|
|
|
* Integer#MAX_SIZE). |
|
|
|
|