[U-Boot] [RFC PATCH] u-boot: remove driver lookup loop from env_save()
Simon Glass
sjg at chromium.org
Tue Jul 10 20:49:39 UTC 2018
Hi Nicholas,
On 10 July 2018 at 06:57, Nicholas Faustini
<nicholas.faustini at azcomtech.com> wrote:
> When called with ENVOP_SAVE, env_get_location() only returns the
> gd->env_load_location variable without actually checking for
> the environment location and priority. This allows saving the
> environment into the same location that has been previously loaded.
>
> This behaviour causes env_save() to fall into an infinite loop when
> the low-level drv->save() call fails.
Why is this? Should it not stop eventually? Do we need a limit on prio?
>
> The env_save() function should not loop through the environment
> location list but it should use the previously discovered
> environment driver once.
What is that? It should be possible to write the env to multiple
places. Also what is the previously discovered environment?
>
> Signed-off-by: Nicholas Faustini <nicholas.faustini at azcomtech.com>
> ---
>
> env/env.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/env/env.c b/env/env.c
> index 5c0842a..897d197 100644
> --- a/env/env.c
> +++ b/env/env.c
> @@ -211,16 +211,16 @@ int env_load(void)
> int env_save(void)
> {
> struct env_driver *drv;
> - int prio;
>
> - for (prio = 0; (drv = env_driver_lookup(ENVOP_SAVE, prio)); prio++) {
> + drv = env_driver_lookup(ENVOP_SAVE, 0);
> + if (drv) {
> int ret;
>
> if (!drv->save)
> - continue;
> + return -ENODEV;
>
> if (!env_has_inited(drv->location))
> - continue;
> + return -ENODEV;
>
> printf("Saving Environment to %s... ", drv->name);
> ret = drv->save();
> --
> 2.7.4
>
Regards,
Simon
More information about the U-Boot
mailing list