env: remove vars that are not in default env

current env_set_default_vars() doesn't delete
var that are not in the imported env. hashtable
removes vars that are not in the imported
env but present in the current env only if H_NOCLEAR
flag is not set.

This change is to avoid passing H_NOCLEAR flag if
specific vars are passed to env_set_default_vars()

Without this change:
Marvell>> env default boot_mode
Marvell>>

With the change:
Marvell>> env default boot_mode
WARNING: 'boot_mode' not in imported env, deleting it!

Signed-off-by: Ravi Minnikanti <rminnikanti@marvell.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Ravi Minnikanti
2024-08-11 11:44:15 -07:00
committed by Tom Rini
parent dbb6b5a010
commit 2a521d01e6
3 changed files with 39 additions and 2 deletions

View File

@@ -79,7 +79,8 @@ The *env default* command resets the selected variables in the U-Boot
environment to their default values. environment to their default values.
var var
list of variable name. list of variable names. If variable is not part of default
environment, it is deleted with a warning message on console.
\-a \-a
all U-Boot environment. all U-Boot environment.
\-f \-f
@@ -309,6 +310,7 @@ Delete environment variable in memory::
Reset environment variable to default value, in memory:: Reset environment variable to default value, in memory::
=> env default bootcmd => env default bootcmd
=> env default ipaddr serverip
=> env default -a => env default -a
Save current environment in persistent storage:: Save current environment in persistent storage::

10
env/common.c vendored
View File

@@ -401,7 +401,15 @@ int env_set_default_vars(int nvars, char * const vars[], int flags)
* Special use-case: import from default environment * Special use-case: import from default environment
* (and use \0 as a separator) * (and use \0 as a separator)
*/ */
flags |= H_NOCLEAR | H_DEFAULT;
/*
* When vars are passed remove variables that are not in
* the default environment.
*/
if (!nvars)
flags |= H_NOCLEAR;
flags |= H_DEFAULT;
return himport_r(&env_htab, default_environment, return himport_r(&env_htab, default_environment,
sizeof(default_environment), '\0', sizeof(default_environment), '\0',
flags, 0, nvars, vars); flags, 0, nvars, vars);

27
test/env/cmd_ut_env.c vendored
View File

@@ -9,6 +9,33 @@
#include <test/suites.h> #include <test/suites.h>
#include <test/ut.h> #include <test/ut.h>
static int env_test_env_cmd(struct unit_test_state *uts)
{
ut_assertok(run_command("setenv non_default_var1 1", 0));
ut_assert_console_end();
ut_assertok(run_command("setenv non_default_var2 1", 0));
ut_assert_console_end();
ut_assertok(run_command("env print non_default_var1", 0));
ut_assert_nextline("non_default_var1=1");
ut_assert_console_end();
ut_assertok(run_command("env default non_default_var1 non_default_var2", 0));
ut_assert_nextline("WARNING: 'non_default_var1' not in imported env, deleting it!");
ut_assert_nextline("WARNING: 'non_default_var2' not in imported env, deleting it!");
ut_assert_console_end();
ut_asserteq(1, run_command("env exists non_default_var1", 0));
ut_assert_console_end();
ut_asserteq(1, run_command("env exists non_default_var2", 0));
ut_assert_console_end();
return 0;
}
ENV_TEST(env_test_env_cmd, UT_TESTF_CONSOLE_REC);
int do_ut_env(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) int do_ut_env(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{ {
struct unit_test *tests = UNIT_TEST_SUITE_START(env_test); struct unit_test *tests = UNIT_TEST_SUITE_START(env_test);