diff options
| author | Leah Rowe <leah@libreboot.org> | 2026-03-13 23:34:41 +0000 |
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2026-03-13 23:34:41 +0000 |
| commit | eadcf89e9859e05b2853bd442cc683982c2b9252 (patch) | |
| tree | b7ee797a94e8985883d935f66c32d1b6b34b5dc7 /util/nvmutil/nvmutil.c | |
| parent | f8ba774796f43f668ac6ee810ca1057037c72c9e (diff) | |
util/nvmutil: split up rw_file_exact
move the gbe-specific parts out of it
what remains is a relatively generic
function; a very conservative implementation,
wrapping around libc functions but with
a few additional safety checks.
Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util/nvmutil/nvmutil.c')
| -rw-r--r-- | util/nvmutil/nvmutil.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c index 410f0886..3a5b175e 100644 --- a/util/nvmutil/nvmutil.c +++ b/util/nvmutil/nvmutil.c @@ -327,6 +327,8 @@ static u8 *gbe_mem_offset(size_t part, const char *f_op); static off_t gbe_file_offset(size_t part, const char *f_op); static off_t gbe_x_offset(size_t part, const char *f_op, const char *d_type, off_t nsize, off_t ncmp); +static ssize_t rw_gbe_file_exact(int fd, u8 *mem, size_t nrw, + off_t off, int rw_type); static ssize_t rw_file_exact(int fd, u8 *mem, size_t len, off_t off, int rw_type); static ssize_t rw_file_once(int fd, u8 *mem, size_t len, @@ -1510,7 +1512,7 @@ rw_gbe_file_part(size_t p, int rw_type, */ mem_offset = gbe_mem_offset(p ^ invert, rw_type_str); - if (rw_file_exact(gbe_fd, mem_offset, + if (rw_gbe_file_exact(gbe_fd, mem_offset, gbe_rw_size, gbe_file_offset(p, rw_type_str), rw_type) == -1) err(errno, "%s: %s: part %lu", @@ -1568,6 +1570,34 @@ gbe_x_offset(size_t p, const char *f_op, const char *d_type, return off; } +static ssize_t +rw_gbe_file_exact(int fd, u8 *mem, size_t nrw, + off_t off, int rw_type) +{ + if (mem == NULL) + goto err_rw_gbe_file_exact; + + if (mem != (void *)pad + && mem != (void *)rnum + && (mem < buf || mem >= (buf + GBE_FILE_SIZE))) + goto err_rw_gbe_file_exact; + + if (off < 0 || off >= gbe_file_size) + goto err_rw_gbe_file_exact; + + if (nrw > (size_t)(gbe_file_size - off)) + goto err_rw_gbe_file_exact; + + if (nrw > GBE_PART_SIZE) + goto err_rw_gbe_file_exact; + + return rw_file_exact(fd, mem, nrw, off, rw_type); + +err_rw_gbe_file_exact: + errno = EIO; + return -1; +} + /* * Read or write the exact contents of a file, * along with a buffer, (if applicable) offset, @@ -1621,20 +1651,6 @@ rw_file_once(int fd, u8 *mem, size_t nrw, if (mem == NULL) goto err_rw_file_once; - if (mem != (void *)pad - && mem != (void *)rnum - && (mem < buf || mem >= (buf + GBE_FILE_SIZE))) - goto err_rw_file_once; - - if (off < 0 || off >= gbe_file_size) - goto err_rw_file_once; - - if (nrw > (size_t)(gbe_file_size - off)) - goto err_rw_file_once; - - if (nrw > GBE_PART_SIZE) - goto err_rw_file_once; - read_again: rv = prw(fd, mem + rc, nrw - rc, off + rc, rw_type); |
