summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/kconfig/preprocess.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c
index 0574039238c6..65da87fce907 100644
--- a/scripts/kconfig/preprocess.c
+++ b/scripts/kconfig/preprocess.c
@@ -229,6 +229,7 @@ struct variable {
char *name;
char *value;
enum variable_flavor flavor;
+ int exp_count;
struct list_head node;
};
@@ -253,11 +254,22 @@ static char *variable_expand(const char *name, int argc, char *argv[])
if (!v)
return NULL;
+ if (argc == 0 && v->exp_count)
+ pperror("Recursive variable '%s' references itself (eventually)",
+ name);
+
+ if (v->exp_count > 1000)
+ pperror("Too deep recursive expansion");
+
+ v->exp_count++;
+
if (v->flavor == VAR_RECURSIVE)
res = expand_string_with_args(v->value, argc, argv);
else
res = xstrdup(v->value);
+ v->exp_count--;
+
return res;
}
@@ -284,6 +296,7 @@ void variable_add(const char *name, const char *value,
v = xmalloc(sizeof(*v));
v->name = xstrdup(name);
+ v->exp_count = 0;
list_add_tail(&v->node, &variable_list);
}