From e47c5087ed9346b9f96ce276a211e1b410ad9910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Cichon=CC=81?= Date: Thu, 25 Jul 2019 13:45:41 +0200 Subject: [PATCH] Thread safety fix Synchronizing on [self class] makes several critical sections across all inheriting classes with one shared NSDictionary object (classNames). I believe it wasn't the intention of the author of this fix (based on a JSONModel issue ticket). To make one critical section we need one static object (lock). --- .../src/main/resources/objc/Object-body.mustache | 4 +++- .../objc/SwaggerClient/Core/SWGObject.m | 4 +++- .../petstore/objc/core-data/SwaggerClient/Core/SWGObject.m | 4 +++- .../petstore/objc/default/SwaggerClient/Core/SWGObject.m | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/objc/Object-body.mustache b/modules/swagger-codegen/src/main/resources/objc/Object-body.mustache index 88df6d6c9ae..2bb6d542609 100644 --- a/modules/swagger-codegen/src/main/resources/objc/Object-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/Object-body.mustache @@ -8,13 +8,15 @@ */ - (instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError **)err { static NSMutableSet *classNames; + static NSObject *lock; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ classNames = [NSMutableSet new]; + lock = [NSObject new]; }); BOOL initSync; - @synchronized([self class]) + @synchronized(lock) { NSString *className = NSStringFromClass([self class]); initSync = ![classNames containsObject:className]; diff --git a/samples/client/petstore-security-test/objc/SwaggerClient/Core/SWGObject.m b/samples/client/petstore-security-test/objc/SwaggerClient/Core/SWGObject.m index db970d34669..1a90a21d1cc 100644 --- a/samples/client/petstore-security-test/objc/SwaggerClient/Core/SWGObject.m +++ b/samples/client/petstore-security-test/objc/SwaggerClient/Core/SWGObject.m @@ -8,13 +8,15 @@ @implementation SWGObject */ - (instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError **)err { static NSMutableSet *classNames; + static NSObject *lock; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ classNames = [NSMutableSet new]; + lock = [NSObject new]; }); BOOL initSync; - @synchronized([self class]) + @synchronized(lock) { NSString *className = NSStringFromClass([self class]); initSync = ![classNames containsObject:className]; diff --git a/samples/client/petstore/objc/core-data/SwaggerClient/Core/SWGObject.m b/samples/client/petstore/objc/core-data/SwaggerClient/Core/SWGObject.m index db970d34669..1a90a21d1cc 100644 --- a/samples/client/petstore/objc/core-data/SwaggerClient/Core/SWGObject.m +++ b/samples/client/petstore/objc/core-data/SwaggerClient/Core/SWGObject.m @@ -8,13 +8,15 @@ @implementation SWGObject */ - (instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError **)err { static NSMutableSet *classNames; + static NSObject *lock; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ classNames = [NSMutableSet new]; + lock = [NSObject new]; }); BOOL initSync; - @synchronized([self class]) + @synchronized(lock) { NSString *className = NSStringFromClass([self class]); initSync = ![classNames containsObject:className]; diff --git a/samples/client/petstore/objc/default/SwaggerClient/Core/SWGObject.m b/samples/client/petstore/objc/default/SwaggerClient/Core/SWGObject.m index db970d34669..1a90a21d1cc 100644 --- a/samples/client/petstore/objc/default/SwaggerClient/Core/SWGObject.m +++ b/samples/client/petstore/objc/default/SwaggerClient/Core/SWGObject.m @@ -8,13 +8,15 @@ @implementation SWGObject */ - (instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError **)err { static NSMutableSet *classNames; + static NSObject *lock; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ classNames = [NSMutableSet new]; + lock = [NSObject new]; }); BOOL initSync; - @synchronized([self class]) + @synchronized(lock) { NSString *className = NSStringFromClass([self class]); initSync = ![classNames containsObject:className];