[libcxxabi] r328507 - [demangler] Fix a bug in r328464 found by oss-fuzz.
Erik Pilkington via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 26 08:34:36 PDT 2018
Author: epilk
Date: Mon Mar 26 08:34:36 2018
New Revision: 328507
URL: http://llvm.org/viewvc/llvm-project?rev=328507&view=rev
Log:
[demangler] Fix a bug in r328464 found by oss-fuzz.
Modified:
libcxxabi/trunk/src/cxa_demangle.cpp
Modified: libcxxabi/trunk/src/cxa_demangle.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=328507&r1=328506&r2=328507&view=diff
==============================================================================
--- libcxxabi/trunk/src/cxa_demangle.cpp (original)
+++ libcxxabi/trunk/src/cxa_demangle.cpp Mon Mar 26 08:34:36 2018
@@ -1096,23 +1096,48 @@ struct ForwardTemplateReference : Node {
size_t Index;
Node *Ref = nullptr;
+ // If we're currently printing this node. It is possible (though invalid) for
+ // a forward template reference to refer to itself via a substitution. This
+ // creates a cyclic AST, which will stack overflow printing. To fix this, bail
+ // out if more than one print* function is active.
+ mutable bool Printing = false;
+
ForwardTemplateReference(size_t Index_)
: Node(KForwardTemplateReference, Cache::Unknown, Cache::Unknown,
Cache::Unknown),
Index(Index_) {}
bool hasRHSComponentSlow(OutputStream &S) const override {
+ if (Printing)
+ return false;
+ SwapAndRestore<bool> SavePrinting(Printing, true);
return Ref->hasRHSComponent(S);
}
bool hasArraySlow(OutputStream &S) const override {
+ if (Printing)
+ return false;
+ SwapAndRestore<bool> SavePrinting(Printing, true);
return Ref->hasArray(S);
}
bool hasFunctionSlow(OutputStream &S) const override {
+ if (Printing)
+ return false;
+ SwapAndRestore<bool> SavePrinting(Printing, true);
return Ref->hasFunction(S);
}
- void printLeft(OutputStream &S) const override { Ref->printLeft(S); }
- void printRight(OutputStream &S) const override { Ref->printRight(S); }
+ void printLeft(OutputStream &S) const override {
+ if (Printing)
+ return;
+ SwapAndRestore<bool> SavePrinting(Printing, true);
+ Ref->printLeft(S);
+ }
+ void printRight(OutputStream &S) const override {
+ if (Printing)
+ return;
+ SwapAndRestore<bool> SavePrinting(Printing, true);
+ Ref->printRight(S);
+ }
};
class NameWithTemplateArgs final : public Node {
More information about the cfe-commits
mailing list