
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