aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Duff <bduff@google.com>2015-06-18 18:31:16 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-06-18 18:31:16 +0000
commit6180b684fac1cdd3d8fbb69d755be6ca540d0826 (patch)
treec6f115fa4e83f8014f9e4f4c81b95af392670634
parent9eb445da75798c275f5ea7ac0a250c92aa67aaca (diff)
parentd7f9473d9e2684e9dfe54db5b32eea6b43bbcc82 (diff)
downloadprotobuf-marshmallow-dr1.6-release.tar.gz
am d7f9473d: am 1817ed30: Merge "Update CodedOutputByteBufferNano to properly handle a malformed surrogate pair with a buffer too small to output a potentially well formed surrogate pair. This behavior mimics that of the ByteBuffer based methods."android-6.0.1_r68android-6.0.1_r67android-6.0.1_r62android-6.0.1_r54android-6.0.1_r53android-6.0.1_r45android-6.0.1_r25android-6.0.1_r24android-6.0.1_r22android-6.0.1_r21marshmallow-dr1.6-releasemarshmallow-dr1.5-releasemarshmallow-dr1.5-devandroid-live-tv
* commit 'd7f9473d9e2684e9dfe54db5b32eea6b43bbcc82': Update CodedOutputByteBufferNano to properly handle a malformed surrogate pair with a buffer too small to output a potentially well formed surrogate pair. This behavior mimics that of the ByteBuffer based methods.
-rw-r--r--java/src/main/java/com/google/protobuf/nano/CodedOutputByteBufferNano.java7
1 files changed, 7 insertions, 0 deletions
diff --git a/java/src/main/java/com/google/protobuf/nano/CodedOutputByteBufferNano.java b/java/src/main/java/com/google/protobuf/nano/CodedOutputByteBufferNano.java
index 304c04212..662f0fa7d 100644
--- a/java/src/main/java/com/google/protobuf/nano/CodedOutputByteBufferNano.java
+++ b/java/src/main/java/com/google/protobuf/nano/CodedOutputByteBufferNano.java
@@ -500,6 +500,13 @@ public final class CodedOutputByteBufferNano {
bytes[j++] = (byte) (0x80 | (0x3F & (codePoint >>> 6)));
bytes[j++] = (byte) (0x80 | (0x3F & codePoint));
} else {
+ // If we are surrogates and we're not a surrogate pair, always throw an
+ // IllegalArgumentException instead of an ArrayOutOfBoundsException.
+ if ((Character.MIN_SURROGATE <= c && c <= Character.MAX_SURROGATE)
+ && (i + 1 == sequence.length()
+ || !Character.isSurrogatePair(c, sequence.charAt(i + 1)))) {
+ throw new IllegalArgumentException("Unpaired surrogate at index " + i);
+ }
throw new ArrayIndexOutOfBoundsException("Failed writing " + c + " at index " + j);
}
}