diff options
author | Benoit Foucher <benoit@zeroc.com> | 2016-04-26 09:00:57 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2016-04-26 09:00:57 +0200 |
commit | c2ce37b7b0f6fc033cac4d52d460ee2f389d7737 (patch) | |
tree | dab204bc1dfd9298c7acb13b9493a210f8c4e978 /java | |
parent | Add jquery-cookie to bower dependency (diff) | |
download | ice-c2ce37b7b0f6fc033cac4d52d460ee2f389d7737.tar.bz2 ice-c2ce37b7b0f6fc033cac4d52d460ee2f389d7737.tar.xz ice-c2ce37b7b0f6fc033cac4d52d460ee2f389d7737.zip |
Fixed ICE-7115 - unmarshalling bug with optional parameters
Diffstat (limited to 'java')
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(); |