mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-17 10:24:49 +00:00
fw_env: fix reading NVMEM device's "compatible" value
Call to fread() was changed to check for return value. The problem is it
can't be checked for returning 1 (as it is) to determine success.
We call fread() with buffer size as "size" argument. Reading any
"compatible" value shorter than buffer size will result in returning 0
even on success.
Modify code to use fstat() to determine expected read length.
This fixes regression that broke using fw_env with NVMEM devices.
Fixes: c059a22b77
("tools: env: fw_env: Fix unused-result warning")
Cc: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
0d53be75c7
commit
f29c5ca33d
1 changed files with 14 additions and 4 deletions
18
tools/env/fw_env.c
vendored
18
tools/env/fw_env.c
vendored
|
@ -1732,6 +1732,7 @@ static int find_nvmem_device(void)
|
|||
}
|
||||
|
||||
while (!nvmem && (dent = readdir(dir))) {
|
||||
struct stat s;
|
||||
FILE *fp;
|
||||
size_t size;
|
||||
|
||||
|
@ -1749,14 +1750,22 @@ static int find_nvmem_device(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
size = fread(buf, sizeof(buf), 1, fp);
|
||||
if (fstat(fileno(fp), &s)) {
|
||||
fprintf(stderr, "Failed to fstat %s\n", comp);
|
||||
goto next;
|
||||
}
|
||||
|
||||
if (s.st_size >= sizeof(buf)) {
|
||||
goto next;
|
||||
}
|
||||
|
||||
size = fread(buf, s.st_size, 1, fp);
|
||||
if (size != 1) {
|
||||
fprintf(stderr,
|
||||
"read failed about %s\n", comp);
|
||||
fclose(fp);
|
||||
return -EIO;
|
||||
goto next;
|
||||
}
|
||||
|
||||
buf[s.st_size] = '\0';
|
||||
|
||||
if (!strcmp(buf, "u-boot,env")) {
|
||||
bytes = asprintf(&nvmem, "%s/%s/nvmem", path, dent->d_name);
|
||||
|
@ -1765,6 +1774,7 @@ static int find_nvmem_device(void)
|
|||
}
|
||||
}
|
||||
|
||||
next:
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue