summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2016-04-26 09:00:57 +0200
committerBenoit Foucher <benoit@zeroc.com>2016-04-26 09:00:57 +0200
commitc2ce37b7b0f6fc033cac4d52d460ee2f389d7737 (patch)
treedab204bc1dfd9298c7acb13b9493a210f8c4e978 /java
parentAdd jquery-cookie to bower dependency (diff)
downloadice-c2ce37b7b0f6fc033cac4d52d460ee2f389d7737.tar.bz2
ice-c2ce37b7b0f6fc033cac4d52d460ee2f389d7737.tar.xz
ice-c2ce37b7b0f6fc033cac4d52d460ee2f389d7737.zip
Fixed ICE-7115 - unmarshalling bug with optional parameters
Diffstat (limited to 'java')
-rw-r--r--java/src/Ice/src/main/java/IceInternal/BasicStream.java24
-rw-r--r--java/src/Ice/src/main/java/IceInternal/Incoming.java3
-rw-r--r--java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java2
-rw-r--r--java/test/src/main/java/test/Ice/optional/AMDInitialI.java9
-rw-r--r--java/test/src/main/java/test/Ice/optional/AllTests.java14
-rw-r--r--java/test/src/main/java/test/Ice/optional/InitialI.java8
-rw-r--r--java/test/src/main/java/test/Ice/optional/Test.ice4
-rw-r--r--java/test/src/main/java/test/Ice/optional/TestAMD.ice4
8 files changed, 51 insertions, 17 deletions
diff --git a/java/src/Ice/src/main/java/IceInternal/BasicStream.java b/java/src/Ice/src/main/java/IceInternal/BasicStream.java
index 5b40a3beb64..e83a2e5234c 100644
--- a/java/src/Ice/src/main/java/IceInternal/BasicStream.java
+++ b/java/src/Ice/src/main/java/IceInternal/BasicStream.java
@@ -412,29 +412,35 @@ public class BasicStream
_readEncapsCache.reset();
}
- public void
- skipEmptyEncaps(Ice.EncodingVersion encoding)
+ public Ice.EncodingVersion
+ skipEmptyEncaps()
{
int sz = readInt();
- if(sz != 6)
+ if(sz < 6)
{
throw new Ice.EncapsulationException();
}
-
- final int pos = _buf.b.position();
- if(pos + 2 > _buf.size())
+ if(sz - 4 > _buf.b.remaining())
{
throw new Ice.UnmarshalOutOfBoundsException();
}
- if(encoding != null)
+ Ice.EncodingVersion encoding = new Ice.EncodingVersion();
+ encoding.__read(this);
+ if(encoding.equals(Ice.Util.Encoding_1_0))
{
- encoding.__read(this);
+ if(sz != 6)
+ {
+ throw new Ice.EncapsulationException();
+ }
}
else
{
- _buf.b.position(pos + 2);
+ // Skip the optional content of the encapsulation if we are expecting an
+ // empty encapsulation.
+ _buf.b.position(_buf.b.position() + sz - 6);
}
+ return encoding;
}
public void
diff --git a/java/src/Ice/src/main/java/IceInternal/Incoming.java b/java/src/Ice/src/main/java/IceInternal/Incoming.java
index 9afd6ed4903..6f1f205854f 100644
--- a/java/src/Ice/src/main/java/IceInternal/Incoming.java
+++ b/java/src/Ice/src/main/java/IceInternal/Incoming.java
@@ -383,8 +383,7 @@ final public class Incoming extends IncomingBase implements Ice.Request
public final void
readEmptyParams()
{
- _current.encoding = new Ice.EncodingVersion();
- _is.skipEmptyEncaps(_current.encoding);
+ _current.encoding = _is.skipEmptyEncaps();
}
public final byte[]
diff --git a/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java b/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java
index 8d776c84af4..55050ec5cc6 100644
--- a/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java
+++ b/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java
@@ -382,7 +382,7 @@ public class OutgoingAsync extends ProxyOutgoingAsyncBase
public void readEmptyParams()
{
- _is.skipEmptyEncaps(null);
+ _is.skipEmptyEncaps();
}
public byte[] readParamEncaps()
diff --git a/java/test/src/main/java/test/Ice/optional/AMDInitialI.java b/java/test/src/main/java/test/Ice/optional/AMDInitialI.java
index 0d132abe559..b7feeebbd80 100644
--- a/java/test/src/main/java/test/Ice/optional/AMDInitialI.java
+++ b/java/test/src/main/java/test/Ice/optional/AMDInitialI.java
@@ -564,7 +564,7 @@ public final class AMDInitialI extends Initial
{
cb.ice_response(new Ice.Optional<OneOptional>(new OneOptional(53)));
}
-
+
@Override
public void
opG_async(AMD_Initial_opG cb, G g, Ice.Current current)
@@ -574,6 +574,13 @@ public final class AMDInitialI extends Initial
@Override
public void
+ opVoid_async(AMD_Initial_opVoid cb, Ice.Current current)
+ {
+ cb.ice_response();
+ }
+
+ @Override
+ public void
supportsRequiredParams_async(AMD_Initial_supportsRequiredParams cb, Ice.Current current)
{
cb.ice_response(true);
diff --git a/java/test/src/main/java/test/Ice/optional/AllTests.java b/java/test/src/main/java/test/Ice/optional/AllTests.java
index 1db643bedae..91d70d7fcea 100644
--- a/java/test/src/main/java/test/Ice/optional/AllTests.java
+++ b/java/test/src/main/java/test/Ice/optional/AllTests.java
@@ -415,7 +415,19 @@ public class AllTests
test(10 == g.gg2.a);
test(20 == g.getGg2Opt().a);
test("gg1".equals(g.gg1.a));
-
+
+ initial.opVoid();
+
+ os = Ice.Util.createOutputStream(communicator);
+ os.startEncapsulation();
+ os.writeOptional(1, Ice.OptionalFormat.F4);
+ os.writeInt(15);
+ os.writeOptional(1, Ice.OptionalFormat.VSize);
+ os.writeString("test");
+ os.endEncapsulation();
+ inEncaps = os.finished();
+ test(initial.ice_invoke("opVoid", Ice.OperationMode.Normal, inEncaps, outEncaps));
+
out.println("ok");
out.print("testing marshaling of large containers with fixed size elements... ");
diff --git a/java/test/src/main/java/test/Ice/optional/InitialI.java b/java/test/src/main/java/test/Ice/optional/InitialI.java
index f581047ac5a..54eda7d7f73 100644
--- a/java/test/src/main/java/test/Ice/optional/InitialI.java
+++ b/java/test/src/main/java/test/Ice/optional/InitialI.java
@@ -612,7 +612,7 @@ public final class InitialI extends Initial
{
o.set(new OneOptional(53));
}
-
+
@Override
public G
opG(G g, Ice.Current current)
@@ -621,6 +621,12 @@ public final class InitialI extends Initial
}
@Override
+ public void
+ opVoid(Ice.Current current)
+ {
+ }
+
+ @Override
public boolean
supportsRequiredParams(Ice.Current current)
{
diff --git a/java/test/src/main/java/test/Ice/optional/Test.ice b/java/test/src/main/java/test/Ice/optional/Test.ice
index 9ea0d9b4028..7fbce8c3270 100644
--- a/java/test/src/main/java/test/Ice/optional/Test.ice
+++ b/java/test/src/main/java/test/Ice/optional/Test.ice
@@ -318,9 +318,11 @@ class Initial
["java:optional"]
void returnOptionalClass(bool req, out optional(1) OneOptional o);
-
+
G opG(G g);
+ void opVoid();
+
bool supportsRequiredParams();
bool supportsJavaSerializable();
diff --git a/java/test/src/main/java/test/Ice/optional/TestAMD.ice b/java/test/src/main/java/test/Ice/optional/TestAMD.ice
index 42af1f17928..e318e105e39 100644
--- a/java/test/src/main/java/test/Ice/optional/TestAMD.ice
+++ b/java/test/src/main/java/test/Ice/optional/TestAMD.ice
@@ -319,9 +319,11 @@ class Initial
["java:optional"]
void returnOptionalClass(bool req, out optional(1) OneOptional o);
-
+
G opG(G g);
+ void opVoid();
+
bool supportsRequiredParams();
bool supportsJavaSerializable();