From 38efd04e336c32f9e570dd7e6404ce0b0fc18029 Mon Sep 17 00:00:00 2001 From: David Chisnall Date: Thu, 31 May 2018 06:49:13 +0100 Subject: [PATCH] Fix some bugs in protocol upgrading from old ABIs. Reported by Riccardo Mottola! --- legacy.c | 2 +- protocol.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/legacy.c b/legacy.c index 6f14682..25e2ed8 100644 --- a/legacy.c +++ b/legacy.c @@ -400,7 +400,7 @@ PRIVATE struct objc_protocol *objc_upgrade_protocol_gsv1(struct objc_protocol_gs p->class_methods = (struct objc_protocol_method_description_list_gcc*)n->class_methods; p->properties = (struct objc_property_list_gsv1*)n->properties; p->optional_properties = (struct objc_property_list_gsv1*)n->optional_properties; - p->isa = objc_getClass("Protocol"); + p->isa = objc_getClass("ProtocolGSv1"); assert(p->isa); return n; } diff --git a/protocol.c b/protocol.c index c726f8d..33d839c 100644 --- a/protocol.c +++ b/protocol.c @@ -206,6 +206,7 @@ static BOOL init_protocols(struct objc_protocol_list *protocols) struct objc_protocol *aProto = protocols->list[i]; // Don't initialise a protocol twice if ((aProto->isa == protocol_class_gcc) || + (aProto->isa == protocol_class_gsv1) || (aProto->isa == protocol_class_gsv2)) { continue; @@ -222,12 +223,16 @@ static BOOL init_protocols(struct objc_protocol_list *protocols) abort(); #ifdef OLDABI_COMPAT case protocol_version_gcc: - protocols->list[i] = aProto = objc_upgrade_protocol_gcc((struct objc_protocol_gcc *)aProto); + protocols->list[i] = objc_upgrade_protocol_gcc((struct objc_protocol_gcc *)aProto); assert(aProto->isa == protocol_class_gcc); + assert(protocols->list[i]->isa == protocol_class_gsv2); + aProto = protocols->list[i]; break; case protocol_version_gsv1: - protocols->list[i] = aProto = objc_upgrade_protocol_gsv1((struct objc_protocol_gsv1 *)aProto); - assert(aProto->isa == protocol_class_gsv2); + protocols->list[i] = objc_upgrade_protocol_gsv1((struct objc_protocol_gsv1 *)aProto); + assert(aProto->isa == protocol_class_gsv1); + assert(protocols->list[i]->isa == protocol_class_gsv2); + aProto = protocols->list[i]; break; #endif case protocol_version_gsv2: