From c52e5792db530f43b1039539359c60d53e560eb3 Mon Sep 17 00:00:00 2001 From: peter klausler Date: Fri, 6 Apr 2018 14:20:29 -0700 Subject: [PATCH] [flang] Crash more gracefully when files include themselves. Original-commit: flang-compiler/f18@6da9ec422824b7e86b10bb368fedd5b734063ce8 Reviewed-on: https://github.com/flang-compiler/f18/pull/48 Tree-same-pre-rewrite: false --- flang/lib/parser/prescan.cc | 8 ++++++++ flang/lib/parser/prescan.h | 1 + 2 files changed, 9 insertions(+) diff --git a/flang/lib/parser/prescan.cc b/flang/lib/parser/prescan.cc index b3132e1..0f9b154 100644 --- a/flang/lib/parser/prescan.cc +++ b/flang/lib/parser/prescan.cc @@ -14,6 +14,8 @@ namespace Fortran { namespace parser { +static constexpr int maxPrescannerNesting{100}; + Prescanner::Prescanner( Messages &messages, CookedSource &cooked, Preprocessor &preprocessor) : messages_{messages}, cooked_{cooked}, preprocessor_{preprocessor} {} @@ -26,6 +28,7 @@ Prescanner::Prescanner(const Prescanner &that) enableBackslashEscapesInCharLiterals_{ that.enableBackslashEscapesInCharLiterals_}, warnOnNonstandardUsage_{that.warnOnNonstandardUsage_}, + prescannerNesting_{that.prescannerNesting_ + 1}, compilerDirectiveBloomFilter_{that.compilerDirectiveBloomFilter_}, compilerDirectiveSentinels_{that.compilerDirectiveSentinels_} {} @@ -53,6 +56,11 @@ void Prescanner::Prescan(ProvenanceRange range) { limit_ = start_ + range.size(); lineStart_ = start_; const bool beganInFixedForm{inFixedForm_}; + if (prescannerNesting_ > maxPrescannerNesting) { + Say("too many nested INCLUDE/#include files, possibly circular"_err_en_US, + GetProvenance(start_)); + return; + } while (lineStart_ < limit_) { Statement(); } diff --git a/flang/lib/parser/prescan.h b/flang/lib/parser/prescan.h index 81953c4..d96c013 100644 --- a/flang/lib/parser/prescan.h +++ b/flang/lib/parser/prescan.h @@ -156,6 +156,7 @@ private: bool enableBackslashEscapesInCharLiterals_{true}; bool warnOnNonstandardUsage_{false}; int delimiterNesting_{0}; + int prescannerNesting_{0}; Provenance startProvenance_; const char *start_{nullptr}; // beginning of current source file content -- 2.7.4