From 87c7fb396a59d3e2be434cc956462ba46451193b Mon Sep 17 00:00:00 2001 From: Simon Goldschmidt Date: Wed, 31 Jan 2018 07:56:48 +0100 Subject: [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 Acked-by: Maxime Ripard --- cmd/nvedit.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cmd/nvedit.c b/cmd/nvedit.c index a690d74..4cb25b8 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; }