summaryrefslogtreecommitdiff
path: root/objective-c
diff options
context:
space:
mode:
authorJoe George <joe@zeroc.com>2020-07-07 16:57:51 -0400
committerGitHub <noreply@github.com>2020-07-07 16:57:51 -0400
commit6c0e7e6fcabde691e7c38a814b6171f9f4e77d09 (patch)
treeaed41fdff6561e134c73da214e580be0910e6f6a /objective-c
parentCopy python dependencies to the extension directory - Close #926 (#927) (diff)
downloadice-6c0e7e6fcabde691e7c38a814b6171f9f4e77d09.tar.bz2
ice-6c0e7e6fcabde691e7c38a814b6171f9f4e77d09.tar.xz
ice-6c0e7e6fcabde691e7c38a814b6171f9f4e77d09.zip
Add class cycle detection during unmarshaling (#946)
Add support for detection of class cycles during unmarshaling in languages which do no have garbage collection: C++, Swift, and Objective-C. A `MarshalException` is thrown when a cycle is detected. The property `Ice.AcceptClassCycles` can be set to a value greater than `0` to change this behavior.
Diffstat (limited to 'objective-c')
-rw-r--r--objective-c/test/Ice/objects/AllTests.m18
-rw-r--r--objective-c/test/Ice/objects/Client.m1
-rw-r--r--objective-c/test/Ice/objects/Collocated.m1
-rw-r--r--objective-c/test/Ice/objects/ObjectsTest.ice3
-rw-r--r--objective-c/test/Ice/objects/TestI.m11
-rw-r--r--objective-c/test/Ice/slicing/objects/Client.m1
-rw-r--r--objective-c/test/Ice/slicing/objects/Server.m1
-rw-r--r--objective-c/test/Ice/stream/Client.m1
8 files changed, 37 insertions, 0 deletions
diff --git a/objective-c/test/Ice/objects/AllTests.m b/objective-c/test/Ice/objects/AllTests.m
index f88a3adc7c8..de23a3d1b63 100644
--- a/objective-c/test/Ice/objects/AllTests.m
+++ b/objective-c/test/Ice/objects/AllTests.m
@@ -706,5 +706,23 @@ objectsAllTests(id<ICECommunicator> communicator, BOOL __unused collocated)
tprintf("ok\n");
}
+ {
+ tprintf("testing sending class cycle... ");
+ TestObjectsRecursive* rec = [TestObjectsRecursive recursive];
+ rec.v = rec;
+ bool acceptsCycles = [initial acceptsClassCycles];
+ @try
+ {
+ [initial setCycle:rec];
+ test(acceptsCycles);
+ }
+ @catch(ICEUnknownLocalException*)
+ {
+ test(!acceptsCycles);
+ }
+ rec.v = nil;
+ tprintf("ok\n");
+ }
+
return initial;
}
diff --git a/objective-c/test/Ice/objects/Client.m b/objective-c/test/Ice/objects/Client.m
index fc3354caec1..243625c942b 100644
--- a/objective-c/test/Ice/objects/Client.m
+++ b/objective-c/test/Ice/objects/Client.m
@@ -121,6 +121,7 @@ main(int argc, char* argv[])
{
ICEInitializationData* initData = [ICEInitializationData initializationData];
initData.properties = defaultClientProperties(&argc, argv);
+ [initData.properties setProperty:@"Ice.AcceptClassCycles" value:@"1"];
#if TARGET_OS_IPHONE
initData.prefixTable_ = [NSDictionary dictionaryWithObjectsAndKeys:
@"TestObjects", @"::Test",
diff --git a/objective-c/test/Ice/objects/Collocated.m b/objective-c/test/Ice/objects/Collocated.m
index 26af67be66d..cf2e2068f93 100644
--- a/objective-c/test/Ice/objects/Collocated.m
+++ b/objective-c/test/Ice/objects/Collocated.m
@@ -135,6 +135,7 @@ main(int argc, char* argv[])
ICEInitializationData* initData = [ICEInitializationData initializationData];
initData.properties = defaultServerProperties(&argc, argv);
[initData.properties setProperty:@"Ice.Warn.Dispatch" value:@"0"];
+ [initData.properties setProperty:@"Ice.AcceptClassCycles" value:@"1"];
#if TARGET_OS_IPHONE
initData.prefixTable_ = [NSDictionary dictionaryWithObjectsAndKeys:
@"TestObjects", @"::Test",
diff --git a/objective-c/test/Ice/objects/ObjectsTest.ice b/objective-c/test/Ice/objects/ObjectsTest.ice
index b7919f45a9e..019db4cd751 100644
--- a/objective-c/test/Ice/objects/ObjectsTest.ice
+++ b/objective-c/test/Ice/objects/ObjectsTest.ice
@@ -225,6 +225,9 @@ class Initial
void setRecursive(Recursive p);
bool supportsClassGraphDepthMax();
+ void setCycle(Recursive r);
+ bool acceptsClassCycles();
+
["marshaled-result"] B getMB();
["amd", "marshaled-result"] B getAMDMB();
diff --git a/objective-c/test/Ice/objects/TestI.m b/objective-c/test/Ice/objects/TestI.m
index f217e09daf4..1c0dae64e65 100644
--- a/objective-c/test/Ice/objects/TestI.m
+++ b/objective-c/test/Ice/objects/TestI.m
@@ -198,6 +198,17 @@
return YES;
}
+-(void) setCycle:(TestObjectsRecursive*)r current:(ICECurrent*)__unused current
+{
+ // break the cycle
+ r.v = nil;
+}
+
+-(BOOL) acceptsClassCycles:(ICECurrent*) current
+{
+ return [[[[current adapter] getCommunicator] getProperties] getPropertyAsInt:@"Ice.AcceptClassCycles"] > 0;
+}
+
-(TestObjectsB*) getMB:(ICECurrent*)__unused current
{
return _b1;
diff --git a/objective-c/test/Ice/slicing/objects/Client.m b/objective-c/test/Ice/slicing/objects/Client.m
index 689c70963d1..857a18b5a9f 100644
--- a/objective-c/test/Ice/slicing/objects/Client.m
+++ b/objective-c/test/Ice/slicing/objects/Client.m
@@ -38,6 +38,7 @@ main(int argc, char* argv[])
{
ICEInitializationData* initData = [ICEInitializationData initializationData];
initData.properties = defaultClientProperties(&argc, argv);
+ [initData.properties setProperty:@"Ice.AcceptClassCycles" value:@"1"];
#if TARGET_OS_IPHONE
initData.prefixTable_ = [NSDictionary dictionaryWithObjectsAndKeys:
@"TestSlicingObjectsClient", @"::Test",
diff --git a/objective-c/test/Ice/slicing/objects/Server.m b/objective-c/test/Ice/slicing/objects/Server.m
index a75e72ea65e..f7dbd8b8365 100644
--- a/objective-c/test/Ice/slicing/objects/Server.m
+++ b/objective-c/test/Ice/slicing/objects/Server.m
@@ -47,6 +47,7 @@ main(int argc, char* argv[])
{
ICEInitializationData* initData = [ICEInitializationData initializationData];
initData.properties = defaultServerProperties(&argc, argv);
+ [initData.properties setProperty:@"Ice.AcceptClassCycles" value:@"1"];
#if TARGET_OS_IPHONE
initData.prefixTable_ = [NSDictionary dictionaryWithObjectsAndKeys:
@"TestSlicingObjectsServer", @"::Test",
diff --git a/objective-c/test/Ice/stream/Client.m b/objective-c/test/Ice/stream/Client.m
index b51a3b43f29..8f22ca293a3 100644
--- a/objective-c/test/Ice/stream/Client.m
+++ b/objective-c/test/Ice/stream/Client.m
@@ -932,6 +932,7 @@ main(int argc, char* argv[])
ICEInitializationData* initData = [ICEInitializationData initializationData];
initData.properties = defaultClientProperties(&argc, argv);
+ [initData.properties setProperty:@"Ice.AcceptClassCycles" value:@"1"];
#if TARGET_OS_IPHONE
initData.prefixTable_ = [NSDictionary dictionaryWithObjectsAndKeys:
@"TestStream", @"::Test",