diff options
author | Joe George <joe@zeroc.com> | 2020-07-07 16:57:51 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-07 16:57:51 -0400 |
commit | 6c0e7e6fcabde691e7c38a814b6171f9f4e77d09 (patch) | |
tree | aed41fdff6561e134c73da214e580be0910e6f6a /objective-c | |
parent | Copy python dependencies to the extension directory - Close #926 (#927) (diff) | |
download | ice-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.m | 18 | ||||
-rw-r--r-- | objective-c/test/Ice/objects/Client.m | 1 | ||||
-rw-r--r-- | objective-c/test/Ice/objects/Collocated.m | 1 | ||||
-rw-r--r-- | objective-c/test/Ice/objects/ObjectsTest.ice | 3 | ||||
-rw-r--r-- | objective-c/test/Ice/objects/TestI.m | 11 | ||||
-rw-r--r-- | objective-c/test/Ice/slicing/objects/Client.m | 1 | ||||
-rw-r--r-- | objective-c/test/Ice/slicing/objects/Server.m | 1 | ||||
-rw-r--r-- | objective-c/test/Ice/stream/Client.m | 1 |
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", |