| From 7498949d956fe53804213f243896ccb3026a1cda Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 18 Jul 2025 16:18:44 -0400 |
| Subject: ktest.pl: Prevent recursion of default variable options |
| |
| From: Steven Rostedt <rostedt@goodmis.org> |
| |
| [ Upstream commit 61f7e318e99d3b398670518dd3f4f8510d1800fc ] |
| |
| If a default variable contains itself, do not recurse on it. |
| |
| For example: |
| |
| ADD_CONFIG := ${CONFIG_DIR}/temp_config |
| DEFAULTS |
| ADD_CONFIG = ${CONFIG_DIR}/default_config ${ADD_CONFIG} |
| |
| The above works because the temp variable ADD_CONFIG (is a temp because it |
| is created with ":=") is already defined, it will be substituted in the |
| variable option. But if it gets commented out: |
| |
| # ADD_CONFIG := ${CONFIG_DIR}/temp_config |
| DEFAULTS |
| ADD_CONFIG = ${CONFIG_DIR}/default_config ${ADD_CONFIG} |
| |
| Then the above will go into a recursive loop where ${ADD_CONFIG} will |
| get replaced with the current definition of ADD_CONFIG which contains the |
| ${ADD_CONFIG} and that will also try to get converted. ktest.pl will error |
| after 100 attempts of recursion and fail. |
| |
| When replacing a variable with the default variable, if the default |
| variable contains itself, do not replace it. |
| |
| Cc: "John Warthog9 Hawley" <warthog9@kernel.org> |
| Cc: Dhaval Giani <dhaval.giani@gmail.com> |
| Cc: Greg KH <gregkh@linuxfoundation.org> |
| Link: https://lore.kernel.org/20250718202053.732189428@kernel.org |
| Signed-off-by: Steven Rostedt <rostedt@goodmis.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/testing/ktest/ktest.pl | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl |
| index 2109bd42c144..26544bba3f8f 100755 |
| --- a/tools/testing/ktest/ktest.pl |
| +++ b/tools/testing/ktest/ktest.pl |
| @@ -1351,7 +1351,10 @@ sub __eval_option { |
| # If a variable contains itself, use the default var |
| if (($var eq $name) && defined($opt{$var})) { |
| $o = $opt{$var}; |
| - $retval = "$retval$o"; |
| + # Only append if the default doesn't contain itself |
| + if ($o !~ m/\$\{$var\}/) { |
| + $retval = "$retval$o"; |
| + } |
| } elsif (defined($opt{$o})) { |
| $o = $opt{$o}; |
| $retval = "$retval$o"; |
| -- |
| 2.39.5 |
| |