Fix FastDataOutput.writeInternedUTF() when over 65534 strings.

The existing code casts mStringRefs.size() to short before comparing it
with 65535, so that the comparison will always evaluate to be smaller
even when the size is actually bigger.

Instead of trying to play around with short and int conversion, it's
more reliable and future-proof to simply represent unsigned short as int
- writeShort() is already accepting int instead of short anyway.

Bug: 243194720
Test: presubmit
Change-Id: Ia2738db57773fa21059b24cc875c07f8facec3c5
This commit is contained in:
Hai Zhang
2022-08-20 01:12:05 +00:00
parent fbef48e6ac
commit 078f6dd69f

View File

@@ -59,7 +59,7 @@ public class FastDataOutput implements DataOutput, Flushable, Closeable {
/**
* Values that have been "interned" by {@link #writeInternedUTF(String)}.
*/
private final HashMap<String, Short> mStringRefs = new HashMap<>();
private final HashMap<String, Integer> mStringRefs = new HashMap<>();
/**
* @deprecated callers must specify {@code use4ByteSequence} so they make a
@@ -256,7 +256,7 @@ public class FastDataOutput implements DataOutput, Flushable, Closeable {
* @see FastDataInput#readInternedUTF()
*/
public void writeInternedUTF(@NonNull String s) throws IOException {
Short ref = mStringRefs.get(s);
Integer ref = mStringRefs.get(s);
if (ref != null) {
writeShort(ref);
} else {
@@ -265,7 +265,7 @@ public class FastDataOutput implements DataOutput, Flushable, Closeable {
// We can only safely intern when we have remaining values; if we're
// full we at least sent the string value above
ref = (short) mStringRefs.size();
ref = mStringRefs.size();
if (ref < MAX_UNSIGNED_SHORT) {
mStringRefs.put(s, ref);
}