| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
- Date: Tue, 12 Dec 2023 18:23:45 +0100
- Subject: [PATCH] fw_env: fix reading NVMEM device's "compatible" value
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- 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: c059a22b7776 ("tools: env: fw_env: Fix unused-result warning")
- Cc: Jaehoon Chung <[email protected]>
- Signed-off-by: Rafał Miłecki <[email protected]>
- ---
- tools/env/fw_env.c | 18 ++++++++++++++----
- 1 file changed, 14 insertions(+), 4 deletions(-)
- --- a/tools/env/fw_env.c
- +++ b/tools/env/fw_env.c
- @@ -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);
- }
-
|