diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2016-11-09 02:47:07 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2016-11-09 02:47:07 +0000 |
commit | f95a000421cc56a8693cd1a63fc5b2defb351279 (patch) | |
tree | 84e41a8b4adde87c1ea5abe31f054f446687bbb4 /clang/lib/Sema/SemaDeclObjC.cpp | |
parent | 0f1ddfa8465291349a380469549b9d8eeea994e2 (diff) | |
download | bcm5719-llvm-f95a000421cc56a8693cd1a63fc5b2defb351279.tar.gz bcm5719-llvm-f95a000421cc56a8693cd1a63fc5b2defb351279.zip |
[index] Fix issue with protocol name locations in conformance list of an ObjC class when they come from a typedef.
The ObjC class protocol list assumes there is an associated location for each protocol but no location is provided
when the protocol list comes from a typedef, and we end up with a buffer overflow when trying to get locations for the protocol names.
Fixes crash of rdar://28980278.
llvm-svn: 286331
Diffstat (limited to 'clang/lib/Sema/SemaDeclObjC.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 1b030801f23..17e7141711e 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -1028,6 +1028,7 @@ ActOnStartClassInterface(Scope *S, SourceLocation AtInterfaceLoc, /// typedef'ed use for a qualified super class and adds them to the list /// of the protocols. void Sema::ActOnTypedefedProtocols(SmallVectorImpl<Decl *> &ProtocolRefs, + SmallVectorImpl<SourceLocation> &ProtocolLocs, IdentifierInfo *SuperName, SourceLocation SuperLoc) { if (!SuperName) @@ -1040,8 +1041,14 @@ void Sema::ActOnTypedefedProtocols(SmallVectorImpl<Decl *> &ProtocolRefs, if (const TypedefNameDecl *TDecl = dyn_cast_or_null<TypedefNameDecl>(IDecl)) { QualType T = TDecl->getUnderlyingType(); if (T->isObjCObjectType()) - if (const ObjCObjectType *OPT = T->getAs<ObjCObjectType>()) + if (const ObjCObjectType *OPT = T->getAs<ObjCObjectType>()) { ProtocolRefs.append(OPT->qual_begin(), OPT->qual_end()); + // FIXME: Consider whether this should be an invalid loc since the loc + // is not actually pointing to a protocol name reference but to the + // typedef reference. Note that the base class name loc is also pointing + // at the typedef. + ProtocolLocs.append(OPT->getNumProtocols(), SuperLoc); + } } } |