summaryrefslogtreecommitdiff
path: root/cpp
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 /cpp
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 'cpp')
-rw-r--r--cpp/include/Ice/BasicStream.h19
-rw-r--r--cpp/test/Ice/optional/AllTests.cpp12
-rw-r--r--cpp/test/Ice/optional/Test.ice6
-rw-r--r--cpp/test/Ice/optional/TestAMD.ice6
-rw-r--r--cpp/test/Ice/optional/TestAMDI.cpp7
-rw-r--r--cpp/test/Ice/optional/TestAMDI.h5
-rw-r--r--cpp/test/Ice/optional/TestI.cpp5
-rw-r--r--cpp/test/Ice/optional/TestI.h4
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&);