Message ID | 20231212173327.22819-1-zajec5@gmail.com |
---|---|
State | Accepted |
Commit | f29c5ca33df4c77b9af2cbfb7ed90bf336613522 |
Delegated to: | Tom Rini |
Headers | show |
Series | fw_env: fix reading NVMEM device's "compatible" value | expand |
On Tue, Dec 12, 2023 at 06:33:27PM +0100, Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > 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 <jh80.chung@samsung.com> > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Applied to u-boot/next, thanks!
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index c9a8774ace..bf8b7ba304 100644 --- 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); }