[U-Boot] [PATCH] cmd: nvedit: env_get_f must check for env_get_char error codes

env_get_f calls env_get_char to load single characters from the environment. However, the return value of env_get_char was not checked for errors. Now if the env driver does not support the .get_char call, env_get_f did not notice this and looped over the whole size of the environment, calling env_get_char over 8000 times with the default settings, just to return an error in the end.
Fix this by checking if env_get_char returns < 0.
Signed-off-by: Simon Goldschmidt sgoldschmidt@de.pepperl-fuchs.com ---
cmd/nvedit.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c index a690d743cd..4cb25b8248 100644 --- a/cmd/nvedit.c +++ b/cmd/nvedit.c @@ -650,12 +650,14 @@ char *env_get(const char *name) */ int env_get_f(const char *name, char *buf, unsigned len) { - int i, nxt; + int i, nxt, c;
for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) { int val, n;
- for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) { + for (nxt = i; (c = env_get_char(nxt)) != '\0'; ++nxt) { + if (c < 0) + return c; if (nxt >= CONFIG_ENV_SIZE) return -1; } @@ -666,7 +668,10 @@ int env_get_f(const char *name, char *buf, unsigned len)
/* found; copy out */ for (n = 0; n < len; ++n, ++buf) { - *buf = env_get_char(val++); + c = env_get_char(val++); + if (c < 0) + return c; + *buf = c; if (*buf == '\0') return n; }

On Wed, Jan 31, 2018 at 07:56:48AM +0100, Simon Goldschmidt wrote:
env_get_f calls env_get_char to load single characters from the environment. However, the return value of env_get_char was not checked for errors. Now if the env driver does not support the .get_char call, env_get_f did not notice this and looped over the whole size of the environment, calling env_get_char over 8000 times with the default settings, just to return an error in the end.
Fix this by checking if env_get_char returns < 0.
Signed-off-by: Simon Goldschmidt sgoldschmidt@de.pepperl-fuchs.com
Acked-by: Maxime Ripard maxime.ripard@free-electrons.com
Thanks! Maxime

On 01/30/2018 10:57 PM, Simon Goldschmidt wrote:
env_get_f calls env_get_char to load single characters from the environment. However, the return value of env_get_char was not checked for errors. Now if the env driver does not support the .get_char call, env_get_f did not notice this and looped over the whole size of the environment, calling env_get_char over 8000 times with the default settings, just to return an error in the end.
Fix this by checking if env_get_char returns < 0.
Signed-off-by: Simon Goldschmidt sgoldschmidt@de.pepperl-fuchs.com
cmd/nvedit.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c index a690d743cd..4cb25b8248 100644 --- a/cmd/nvedit.c +++ b/cmd/nvedit.c @@ -650,12 +650,14 @@ char *env_get(const char *name) */ int env_get_f(const char *name, char *buf, unsigned len) {
- int i, nxt;
int i, nxt, c;
for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) { int val, n;
for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) {
for (nxt = i; (c = env_get_char(nxt)) != '\0'; ++nxt) {
if (c < 0)
}return c; if (nxt >= CONFIG_ENV_SIZE) return -1;
@@ -666,7 +668,10 @@ int env_get_f(const char *name, char *buf, unsigned len)
/* found; copy out */ for (n = 0; n < len; ++n, ++buf) {
*buf = env_get_char(val++);
c = env_get_char(val++);
if (c < 0)
return c;
}*buf = c; if (*buf == '\0') return n;
Simon,
This patch looks correct. But it doesn't fix NOR flash. Do you have plan to add .get_char function to other drivers? Without that function, we cannot get env variables before relocation.
York

On 01.02.2018 00:00, York Sun wrote:
On 01/30/2018 10:57 PM, Simon Goldschmidt wrote:
env_get_f calls env_get_char to load single characters from the environment. However, the return value of env_get_char was not checked for errors. Now if the env driver does not support the .get_char call, env_get_f did not notice this and looped over the whole size of the environment, calling env_get_char over 8000 times with the default settings, just to return an error in the end.
Fix this by checking if env_get_char returns < 0.
Signed-off-by: Simon Goldschmidt sgoldschmidt@de.pepperl-fuchs.com
cmd/nvedit.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c index a690d743cd..4cb25b8248 100644 --- a/cmd/nvedit.c +++ b/cmd/nvedit.c @@ -650,12 +650,14 @@ char *env_get(const char *name) */ int env_get_f(const char *name, char *buf, unsigned len) {
- int i, nxt;
int i, nxt, c;
for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) { int val, n;
for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) {
for (nxt = i; (c = env_get_char(nxt)) != '\0'; ++nxt) {
if (c < 0)
}return c; if (nxt >= CONFIG_ENV_SIZE) return -1;
@@ -666,7 +668,10 @@ int env_get_f(const char *name, char *buf, unsigned len)
/* found; copy out */ for (n = 0; n < len; ++n, ++buf) {
*buf = env_get_char(val++);
c = env_get_char(val++);
if (c < 0)
return c;
}*buf = c; if (*buf == '\0') return n;
Simon,
This patch looks correct. But it doesn't fix NOR flash. Do you have plan to add .get_char function to other drivers? Without that function, we cannot get env variables before relocation.
Ehrm, sorry I don't plan to do that, no: my target seems to run fine without this.
Given that only the eeprom and nvram env drivers support the get_char method, I don't know if this is widely used at all. Maybe a better fallback would be to just remove that get_char code path totally and always load from the internal (default) environment until the full environment is available (after relocation).
After all, the environment variables loaded via get_char are not CRC checked at all. To me, this is another indication that this code is not really useful and should probably be removed.
Maxime and others, what do you think?
Simon

Hi Simon,
On Thu, Feb 01, 2018 at 10:16:46AM +0100, Simon Goldschmidt wrote:
On 01.02.2018 00:00, York Sun wrote:
On 01/30/2018 10:57 PM, Simon Goldschmidt wrote:
env_get_f calls env_get_char to load single characters from the environment. However, the return value of env_get_char was not checked for errors. Now if the env driver does not support the .get_char call, env_get_f did not notice this and looped over the whole size of the environment, calling env_get_char over 8000 times with the default settings, just to return an error in the end.
Fix this by checking if env_get_char returns < 0.
Signed-off-by: Simon Goldschmidt sgoldschmidt@de.pepperl-fuchs.com
cmd/nvedit.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c index a690d743cd..4cb25b8248 100644 --- a/cmd/nvedit.c +++ b/cmd/nvedit.c @@ -650,12 +650,14 @@ char *env_get(const char *name) */ int env_get_f(const char *name, char *buf, unsigned len) {
- int i, nxt;
- int i, nxt, c; for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) { int val, n;
for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) {
for (nxt = i; (c = env_get_char(nxt)) != '\0'; ++nxt) {
if (c < 0)
}return c; if (nxt >= CONFIG_ENV_SIZE) return -1;
@@ -666,7 +668,10 @@ int env_get_f(const char *name, char *buf, unsigned len) /* found; copy out */ for (n = 0; n < len; ++n, ++buf) {
*buf = env_get_char(val++);
c = env_get_char(val++);
if (c < 0)
return c;
}*buf = c; if (*buf == '\0') return n;
Simon,
This patch looks correct. But it doesn't fix NOR flash. Do you have plan to add .get_char function to other drivers? Without that function, we cannot get env variables before relocation.
Ehrm, sorry I don't plan to do that, no: my target seems to run fine without this.
Given that only the eeprom and nvram env drivers support the get_char method, I don't know if this is widely used at all. Maybe a better fallback would be to just remove that get_char code path totally and always load from the internal (default) environment until the full environment is available (after relocation).
After all, the environment variables loaded via get_char are not CRC checked at all. To me, this is another indication that this code is not really useful and should probably be removed.
To be honest, I'm not really sure what get_char was here for in the first place, so getting rid of it sounds like a good idea :)
Maxime

On 02/02/2018 10:51 AM, Maxime Ripard wrote:
<snip>
Simon,
This patch looks correct. But it doesn't fix NOR flash. Do you have plan to add .get_char function to other drivers? Without that function, we cannot get env variables before relocation.
Ehrm, sorry I don't plan to do that, no: my target seems to run fine without this.
Given that only the eeprom and nvram env drivers support the get_char method, I don't know if this is widely used at all. Maybe a better fallback would be to just remove that get_char code path totally and always load from the internal (default) environment until the full environment is available (after relocation).
After all, the environment variables loaded via get_char are not CRC checked at all. To me, this is another indication that this code is not really useful and should probably be removed.
To be honest, I'm not really sure what get_char was here for in the first place, so getting rid of it sounds like a good idea :)
On almost all my boards, a variable hwconfig is read before relocation to determine DDR configuration. This has been broken. I don't mind you remove some dead code. But this is breaking almost all my boards booting from NOR flash.
York

Hi York,
On Fri, Feb 02, 2018 at 08:04:12PM +0000, York Sun wrote:
On 02/02/2018 10:51 AM, Maxime Ripard wrote:
This patch looks correct. But it doesn't fix NOR flash. Do you have plan to add .get_char function to other drivers? Without that function, we cannot get env variables before relocation.
Ehrm, sorry I don't plan to do that, no: my target seems to run fine without this.
Given that only the eeprom and nvram env drivers support the get_char method, I don't know if this is widely used at all. Maybe a better fallback would be to just remove that get_char code path totally and always load from the internal (default) environment until the full environment is available (after relocation).
After all, the environment variables loaded via get_char are not CRC checked at all. To me, this is another indication that this code is not really useful and should probably be removed.
To be honest, I'm not really sure what get_char was here for in the first place, so getting rid of it sounds like a good idea :)
On almost all my boards, a variable hwconfig is read before relocation to determine DDR configuration. This has been broken. I don't mind you remove some dead code. But this is breaking almost all my boards booting from NOR flash.
Sorry if it fell through the cracks, I don't have a board with NOR myself. Do you know what breaks exactly?
Or can you bisect at least?
Thanks! Maxime

On 02/05/2018 05:44 AM, Maxime Ripard wrote:
Hi York,
On Fri, Feb 02, 2018 at 08:04:12PM +0000, York Sun wrote:
On 02/02/2018 10:51 AM, Maxime Ripard wrote:
This patch looks correct. But it doesn't fix NOR flash. Do you have plan to add .get_char function to other drivers? Without that function, we cannot get env variables before relocation.
Ehrm, sorry I don't plan to do that, no: my target seems to run fine without this.
Given that only the eeprom and nvram env drivers support the get_char method, I don't know if this is widely used at all. Maybe a better fallback would be to just remove that get_char code path totally and always load from the internal (default) environment until the full environment is available (after relocation).
After all, the environment variables loaded via get_char are not CRC checked at all. To me, this is another indication that this code is not really useful and should probably be removed.
To be honest, I'm not really sure what get_char was here for in the first place, so getting rid of it sounds like a good idea :)
On almost all my boards, a variable hwconfig is read before relocation to determine DDR configuration. This has been broken. I don't mind you remove some dead code. But this is breaking almost all my boards booting from NOR flash.
Sorry if it fell through the cracks, I don't have a board with NOR myself. Do you know what breaks exactly?
Or can you bisect at least?
Yes, I did. It was the #3 patch in the series of "env: Multiple env support and env transition for sunxi". I reported in the email thread "Re: [U-Boot] [PATCH v3 09/15] env: Support multiple environments", along with another problem found regarding variable "env_load_location". The latter problem breaks saveenv on NOR flash.
York

On Mon, Feb 05, 2018 at 04:30:50PM +0000, York Sun wrote:
On 02/05/2018 05:44 AM, Maxime Ripard wrote:
Hi York,
On Fri, Feb 02, 2018 at 08:04:12PM +0000, York Sun wrote:
On 02/02/2018 10:51 AM, Maxime Ripard wrote:
This patch looks correct. But it doesn't fix NOR flash. Do you have plan to add .get_char function to other drivers? Without that function, we cannot get env variables before relocation.
Ehrm, sorry I don't plan to do that, no: my target seems to run fine without this.
Given that only the eeprom and nvram env drivers support the get_char method, I don't know if this is widely used at all. Maybe a better fallback would be to just remove that get_char code path totally and always load from the internal (default) environment until the full environment is available (after relocation).
After all, the environment variables loaded via get_char are not CRC checked at all. To me, this is another indication that this code is not really useful and should probably be removed.
To be honest, I'm not really sure what get_char was here for in the first place, so getting rid of it sounds like a good idea :)
On almost all my boards, a variable hwconfig is read before relocation to determine DDR configuration. This has been broken. I don't mind you remove some dead code. But this is breaking almost all my boards booting from NOR flash.
Sorry if it fell through the cracks, I don't have a board with NOR myself. Do you know what breaks exactly?
Or can you bisect at least?
Yes, I did. It was the #3 patch in the series of "env: Multiple env support and env transition for sunxi". I reported in the email thread "Re: [U-Boot] [PATCH v3 09/15] env: Support multiple environments", along with another problem found regarding variable "env_load_location". The latter problem breaks saveenv on NOR flash.
Ah, right, I overlooked it, sorry.
I'll reply there.
Thanks! Maxime

On Wed, Jan 31, 2018 at 07:56:48AM +0100, Simon Goldschmidt wrote:
env_get_f calls env_get_char to load single characters from the environment. However, the return value of env_get_char was not checked for errors. Now if the env driver does not support the .get_char call, env_get_f did not notice this and looped over the whole size of the environment, calling env_get_char over 8000 times with the default settings, just to return an error in the end.
Fix this by checking if env_get_char returns < 0.
Signed-off-by: Simon Goldschmidt sgoldschmidt@de.pepperl-fuchs.com Acked-by: Maxime Ripard maxime.ripard@free-electrons.com
Applied to u-boot/master, thanks!
participants (5)
-
Maxime Ripard
-
Maxime Ripard
-
Simon Goldschmidt
-
Tom Rini
-
York Sun