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 /cpp | |
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 'cpp')
-rw-r--r-- | cpp/include/Ice/BasicStream.h | 19 | ||||
-rw-r--r-- | cpp/test/Ice/optional/AllTests.cpp | 12 | ||||
-rw-r--r-- | cpp/test/Ice/optional/Test.ice | 6 | ||||
-rw-r--r-- | cpp/test/Ice/optional/TestAMD.ice | 6 | ||||
-rw-r--r-- | cpp/test/Ice/optional/TestAMDI.cpp | 7 | ||||
-rw-r--r-- | cpp/test/Ice/optional/TestAMDI.h | 5 | ||||
-rw-r--r-- | cpp/test/Ice/optional/TestI.cpp | 5 | ||||
-rw-r--r-- | cpp/test/Ice/optional/TestI.h | 4 |
8 files changed, 53 insertions, 11 deletions
diff --git a/cpp/include/Ice/BasicStream.h b/cpp/include/Ice/BasicStream.h index da2ffde4a7f..0650e0971df 100644 --- a/cpp/include/Ice/BasicStream.h +++ b/cpp/include/Ice/BasicStream.h @@ -271,18 +271,29 @@ public: { Ice::Int sz; read(sz); - if(sz != static_cast<Ice::Int>(sizeof(Ice::Int)) + 2) + if(sz < 6) { throwEncapsulationException(__FILE__, __LINE__); } - - if(i + 2 > b.end()) + if(i - sizeof(Ice::Int) + sz > b.end()) { throwUnmarshalOutOfBoundsException(__FILE__, __LINE__); } - Ice::EncodingVersion encoding; read(encoding); + if(encoding == Ice::Encoding_1_0) + { + if(sz != static_cast<Ice::Int>(sizeof(Ice::Int)) + 2) + { + throwEncapsulationException(__FILE__, __LINE__); + } + } + else + { + // Skip the optional content of the encapsulation if we are expecting an + // empty encapsulation. + i += sz - sizeof(Ice::Int) - 2; + } return encoding; } void endReadEncapsChecked(); // Used by public stream API. diff --git a/cpp/test/Ice/optional/AllTests.cpp b/cpp/test/Ice/optional/AllTests.cpp index 51a5e264a45..085bf62613a 100644 --- a/cpp/test/Ice/optional/AllTests.cpp +++ b/cpp/test/Ice/optional/AllTests.cpp @@ -621,7 +621,7 @@ allTests(const Ice::CommunicatorPtr& communicator, bool) RecursivePtr outer = new Recursive(); outer->value = recursive1; initial->pingPong(outer); - + GPtr g = new G(); g->gg1Opt = new G1("gg1Opt"); g->gg2 = new G2(10); @@ -633,6 +633,16 @@ allTests(const Ice::CommunicatorPtr& communicator, bool) test(20 == r->gg2Opt.get()->a); test("gg1" == r->gg1->a); + initial->opVoid(); + + out = Ice::createOutputStream(communicator); + out->startEncapsulation(); + out->write(1, IceUtil::Optional<int>(15)); + out->write(2, IceUtil::Optional<string>("test")); + out->endEncapsulation(); + out->finished(inEncaps); + test(initial->ice_invoke("opVoid", Ice::Normal, inEncaps, outEncaps)); + cout << "ok" << endl; cout << "testing marshalling of large containers with fixed size elements..." << flush; diff --git a/cpp/test/Ice/optional/Test.ice b/cpp/test/Ice/optional/Test.ice index 77a0c41665e..87061a2f317 100644 --- a/cpp/test/Ice/optional/Test.ice +++ b/cpp/test/Ice/optional/Test.ice @@ -232,7 +232,7 @@ class Initial optional(1) string opString(optional(2) string p1, out optional(3) string p3); ["cpp:view-type:Util::string_view"] optional(1) string - opCustomString(["cpp:view-type:Util::string_view"] optional(2) string p1, + opCustomString(["cpp:view-type:Util::string_view"] optional(2) string p1, out ["cpp:view-type:Util::string_view"] optional(3) string p3); optional(1) MyEnum opMyEnum(optional(2) MyEnum p1, out optional(3) MyEnum p3); @@ -303,9 +303,11 @@ class Initial void sendOptionalClass(bool req, optional(1) OneOptional o); void returnOptionalClass(bool req, out optional(1) OneOptional o); - + G opG(G g); + void opVoid(); + bool supportsRequiredParams(); bool supportsJavaSerializable(); diff --git a/cpp/test/Ice/optional/TestAMD.ice b/cpp/test/Ice/optional/TestAMD.ice index ed96f12362c..bac3d41df7f 100644 --- a/cpp/test/Ice/optional/TestAMD.ice +++ b/cpp/test/Ice/optional/TestAMD.ice @@ -233,7 +233,7 @@ class Initial optional(1) string opString(optional(2) string p1, out optional(3) string p3); ["cpp:view-type:Util::string_view"] optional(1) string - opCustomString(["cpp:view-type:Util::string_view"] optional(2) string p1, + opCustomString(["cpp:view-type:Util::string_view"] optional(2) string p1, out ["cpp:view-type:Util::string_view"] optional(3) string p3); optional(1) MyEnum opMyEnum(optional(2) MyEnum p1, out optional(3) MyEnum p3); @@ -304,9 +304,11 @@ class Initial void sendOptionalClass(bool req, optional(1) OneOptional o); void returnOptionalClass(bool req, out optional(1) OneOptional o); - + G opG(G g); + void opVoid(); + bool supportsRequiredParams(); bool supportsJavaSerializable(); diff --git a/cpp/test/Ice/optional/TestAMDI.cpp b/cpp/test/Ice/optional/TestAMDI.cpp index 86959335d4e..fea753dfbdd 100644 --- a/cpp/test/Ice/optional/TestAMDI.cpp +++ b/cpp/test/Ice/optional/TestAMDI.cpp @@ -385,6 +385,13 @@ InitialI::opG_async(const ::Test::AMD_Initial_opGPtr& cb, } void +InitialI::opVoid_async(const ::Test::AMD_Initial_opVoidPtr& cb, + const Ice::Current&) +{ + cb->ice_response(); +} + +void InitialI::supportsRequiredParams_async(const ::Test::AMD_Initial_supportsRequiredParamsPtr& cb, const Ice::Current&) { diff --git a/cpp/test/Ice/optional/TestAMDI.h b/cpp/test/Ice/optional/TestAMDI.h index 4b34ba72b7e..83c12fe1f08 100644 --- a/cpp/test/Ice/optional/TestAMDI.h +++ b/cpp/test/Ice/optional/TestAMDI.h @@ -190,11 +190,14 @@ public: virtual void returnOptionalClass_async(const ::Test::AMD_Initial_returnOptionalClassPtr&, bool, const Ice::Current&); - + virtual void opG_async(const ::Test::AMD_Initial_opGPtr&, const ::Test::GPtr&, const Ice::Current&); + virtual void opVoid_async(const ::Test::AMD_Initial_opVoidPtr&, + const Ice::Current&); + virtual void supportsRequiredParams_async(const ::Test::AMD_Initial_supportsRequiredParamsPtr&, const Ice::Current&); diff --git a/cpp/test/Ice/optional/TestI.cpp b/cpp/test/Ice/optional/TestI.cpp index c3018841afd..bbf68c7bfc2 100644 --- a/cpp/test/Ice/optional/TestI.cpp +++ b/cpp/test/Ice/optional/TestI.cpp @@ -389,6 +389,11 @@ InitialI::opG(const GPtr& g, const Ice::Current&) return g; } +void +InitialI::opVoid(const Ice::Current&) +{ +} + bool InitialI::supportsRequiredParams(const Ice::Current&) { diff --git a/cpp/test/Ice/optional/TestI.h b/cpp/test/Ice/optional/TestI.h index 28a9818cc50..081206f3469 100644 --- a/cpp/test/Ice/optional/TestI.h +++ b/cpp/test/Ice/optional/TestI.h @@ -184,9 +184,11 @@ public: virtual void sendOptionalClass(bool, const IceUtil::Optional<Test::OneOptionalPtr>&, const Ice::Current&); virtual void returnOptionalClass(bool, IceUtil::Optional<Test::OneOptionalPtr>&, const Ice::Current&); - + virtual ::Test::GPtr opG(const ::Test::GPtr& g, const Ice::Current&); + virtual void opVoid(const Ice::Current&); + virtual bool supportsRequiredParams(const Ice::Current&); virtual bool supportsJavaSerializable(const Ice::Current&); |