summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorSimon Goldschmidt <sgoldschmidt@de.pepperl-fuchs.com>2018-01-31 07:56:48 +0100
committerTom Rini <trini@konsulko.com>2018-01-31 18:45:10 -0500
commit87c7fb396a59d3e2be434cc956462ba46451193b (patch)
treeb4b6f06e614e702c6283b2e57d4c7ea9128086e5 /cmd
parent48f58a59737739b0f96ceba9f7873178c6d917bf (diff)
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> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/nvedit.c11
1 files 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;
}