Skip to content

Commit 0654587

Browse files
committed
Fix edge-case in gwt-rpc client deserialization
Extracting the stream version (before actually parsing it) failed when the version ends up being the only element in a concatenated array. Bug: #9536 Bug-Link: #9536 Change-Id: I4faa225e7ef6c990f588277aa287731aa07c22a0
1 parent 7e730fe commit 0654587

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

user/super/com/google/gwt/user/translatable/com/google/gwt/user/client/rpc/impl/ClientSerializationStreamReader.java

+4
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ private native JavaScriptObject readJavaScriptObject() /*-{
145145
private static int readVersion(String encodedString) {
146146
String versionStr =
147147
encodedString.substring(encodedString.lastIndexOf(",") + 1, encodedString.lastIndexOf("]"));
148+
int pos = versionStr.lastIndexOf("[");
149+
if (pos >= 0) {
150+
versionStr = versionStr.substring(pos + 1);
151+
}
148152
return Integer.parseInt(versionStr.trim());
149153
}
150154

user/test/com/google/gwt/user/client/rpc/impl/WebModeClientSerializationStreamReaderTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,25 @@ public void testParsingVersion7() throws SerializationException {
7474
assertTrue(Double.isNaN(reader.readDouble()));
7575
}
7676

77+
/**
78+
* Tests edge-case where version is moved to single item in concatenated array.
79+
*
80+
* See https://github.com/gwtproject/gwt/issues/9536
81+
*/
82+
public void testParsingVersion7ArrayConcats() throws SerializationException {
83+
ClientSerializationStreamReader reader = new ClientSerializationStreamReader(null);
84+
85+
String encoded = "[42,[],0].concat([7])";
86+
87+
assertEquals(7, readVersion(encoded));
88+
89+
reader.prepareToRead(encoded);
90+
91+
assertEquals(7, reader.getVersion());
92+
93+
assertEquals(42, reader.readInt());
94+
}
95+
7796
private native int readVersion(String encoded)/*-{
7897
return @com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader::readVersion(Ljava/lang/String;)(encoded);
7998
}-*/;

0 commit comments

Comments
 (0)