diff options
Diffstat (limited to 'util/nvmutil')
| -rw-r--r-- | util/nvmutil/nvmutil.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c index 14891918..68627d3a 100644 --- a/util/nvmutil/nvmutil.c +++ b/util/nvmutil/nvmutil.c @@ -1640,8 +1640,7 @@ read_again: if (rv < 0) return -1; - if ((size_t)rv > SSIZE_MAX /* theoretical buggy libc */ - || (size_t)rv > (nrw - rc))/* don't overflow */ + if ((size_t)rv > (nrw - rc))/* don't overflow */ goto err_rw_file_once; if (rv != 0) @@ -1730,6 +1729,20 @@ try_rw_again: r = read(fd, mem, nrw); else if (rw_type == IO_PWRITE) r = write(fd, mem, nrw); + if ((size_t)r > SSIZE_MAX) { + /* + * Theoretical buggy libc. + * Specifications never + * allow this return value + * to exceed SSIZE_MAX, but + * spec != implementation + */ + errno = EIO; + r = -1; + + /* Don't use the goto here. + We need to reset lseek */ + } } while (r < 0 && errno == EINTR); saved_errno = errno; |
