summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kconfiglib.py13
-rw-r--r--tests/Krecursive11
-rw-r--r--tests/Krecursive21
-rw-r--r--testsuite.py11
4 files changed, 26 insertions, 0 deletions
diff --git a/kconfiglib.py b/kconfiglib.py
index f111fe5..256c02c 100644
--- a/kconfiglib.py
+++ b/kconfiglib.py
@@ -1112,6 +1112,19 @@ class Kconfig(object):
Jumps to the beginning of a sourced Kconfig file, saving the previous
position and file object.
"""
+ # Check for recursive 'source'
+ for _, name, _ in self._filestack:
+ if name == filename:
+ # KconfigParseError might have been a better name, but too late
+ raise KconfigSyntaxError(
+ "\n{}:{}: Recursive 'source' of '{}' detected. Check that "
+ "environment variables are set correctly.\n"
+ "Backtrace:\n{}"
+ .format(self._filename, self._linenr, filename,
+ "\n".join("{}:{}".format(name, linenr)
+ for _, name, linenr
+ in reversed(self._filestack))))
+
self._filestack.append((self._file, self._filename, self._linenr))
try:
self._file = self._open(filename)
diff --git a/tests/Krecursive1 b/tests/Krecursive1
new file mode 100644
index 0000000..c4008c2
--- /dev/null
+++ b/tests/Krecursive1
@@ -0,0 +1 @@
+source "Kconfiglib/tests/Krecursive2"
diff --git a/tests/Krecursive2 b/tests/Krecursive2
new file mode 100644
index 0000000..5032b29
--- /dev/null
+++ b/tests/Krecursive2
@@ -0,0 +1 @@
+source "Kconfiglib/tests/Krecursive1"
diff --git a/testsuite.py b/testsuite.py
index 8306c05..a876f0e 100644
--- a/testsuite.py
+++ b/testsuite.py
@@ -779,6 +779,17 @@ g
verify_locations([c.syms["COMMENT_HOOK"].nodes[0].next],
"tests/Klocation_included:15")
+ # Test recursive 'source' detection
+
+ got_syntax_exception = False
+ try:
+ Kconfig("Kconfiglib/tests/Krecursive1")
+ except KconfigSyntaxError:
+ got_syntax_exception = True
+
+ verify(got_syntax_exception,
+ "recursive 'source' did not raise KconfigSyntaxError")
+
print("Testing visibility")