summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2023-02-07 14:32:25 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2023-02-08 12:53:31 +0000
commitbd2ca236e11b25ae28e8f519258627f66a34ddfd (patch)
tree0d4c812cc04bac47621660e24d9c46b696319cd6
parent06b579a75be7924462a3cdfe9ecb8e60b3e01524 (diff)
downloadqt-creator-bd2ca236e11b25ae28e8f519258627f66a34ddfd.tar.gz
CPlusPlus: Check maximum include depth in lexer
We use a value of 200, which is also GCC's default. Fixes: QTCREATORBUG-28770 Change-Id: Id02b324cd2ffa81a709441a5d93856bcd06501c3 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r--src/libs/cplusplus/pp-engine.cpp10
-rw-r--r--src/libs/cplusplus/pp-engine.h3
-rw-r--r--src/libs/utils/guard.h1
-rw-r--r--tests/auto/cplusplus/translationunit/CMakeLists.txt2
4 files changed, 15 insertions, 1 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 50cd1241de..de18711233 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -57,6 +57,7 @@ using namespace Utils;
namespace {
enum {
MAX_FUNCTION_LIKE_ARGUMENTS_COUNT = 100,
+ MAX_INCLUDE_DEPTH = 200,
MAX_TOKEN_EXPANSION_COUNT = 5000,
MAX_TOKEN_BUFFER_DEPTH = 16000 // for when macros are using some kind of right-folding, this is the list of "delayed" buffers waiting to be expanded after the current one.
};
@@ -1677,6 +1678,15 @@ void Preprocessor::handleIncludeDirective(PPToken *tk, bool includeNext)
if (m_cancelChecker && m_cancelChecker())
return;
+ GuardLocker depthLocker(m_includeDepthGuard);
+ if (m_includeDepthGuard.lockCount() > MAX_INCLUDE_DEPTH) {
+ // FIXME: Categorized logging!
+#ifndef NO_DEBUG
+ std::cerr << "Maximum include depth exceeded" << m_state.m_currentFileName << std::endl;
+#endif
+ return;
+ }
+
m_state.m_lexer->setScanAngleStringLiteralTokens(true);
lex(tk); // consume "include" token
m_state.m_lexer->setScanAngleStringLiteralTokens(false);
diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h
index 49cdab2b82..c888e8775d 100644
--- a/src/libs/cplusplus/pp-engine.h
+++ b/src/libs/cplusplus/pp-engine.h
@@ -29,6 +29,8 @@
#include <cplusplus/Lexer.h>
#include <cplusplus/Token.h>
+#include <utils/guard.h>
+
#include <QVector>
#include <QBitArray>
#include <QByteArray>
@@ -241,6 +243,7 @@ private:
Environment *m_env;
QByteArray m_scratchBuffer;
CancelChecker m_cancelChecker;
+ Utils::Guard m_includeDepthGuard;
bool m_expandFunctionlikeMacros;
bool m_keepComments;
diff --git a/src/libs/utils/guard.h b/src/libs/utils/guard.h
index 7df63de022..163bd2966f 100644
--- a/src/libs/utils/guard.h
+++ b/src/libs/utils/guard.h
@@ -16,6 +16,7 @@ public:
Guard();
~Guard();
bool isLocked() const;
+ int lockCount() const { return m_lockCount; }
// Prefer using GuardLocker when possible. These two methods are provided only for cases
// when locking and unlocking are done in separate methods, so that GuardLocker can't be
diff --git a/tests/auto/cplusplus/translationunit/CMakeLists.txt b/tests/auto/cplusplus/translationunit/CMakeLists.txt
index 68e8eb69f3..c26d8477dd 100644
--- a/tests/auto/cplusplus/translationunit/CMakeLists.txt
+++ b/tests/auto/cplusplus/translationunit/CMakeLists.txt
@@ -1,4 +1,4 @@
add_qtc_test(tst_cplusplus_translationunit
- DEPENDS CppEditor
+ DEPENDS CppEditor Utils
SOURCES tst_translationunit.cpp
)