mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-18 04:22:15 +02:00
util/nvmutil: block O_APPEND in prw()
O_APPEND allows writes at EOF, thus breaking positional read/write Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
+13
-11
@@ -1557,17 +1557,6 @@ gbe_x_offset(size_t p, const char *f_op, const char *d_type,
|
|||||||
* be used on sockets or pipes, because 0-byte
|
* be used on sockets or pipes, because 0-byte
|
||||||
* reads are treated like fatal errors. This
|
* reads are treated like fatal errors. This
|
||||||
* means that EOF is also considered fatal.
|
* means that EOF is also considered fatal.
|
||||||
*
|
|
||||||
* WARNING: Do not use O_APPEND on open() when
|
|
||||||
* using this function. If you do, POSIX allows
|
|
||||||
* write() to ignore the current file offset and
|
|
||||||
* write at EOF, which means that our use of
|
|
||||||
* lseek in prw() does not guarantee writing at
|
|
||||||
* a specified offset. So if using IO_PWRITE or
|
|
||||||
* IO_PREAD, make sure not to pass a file descriptor
|
|
||||||
* with the O_APPEND flag. Alternatively, modify
|
|
||||||
* do_rw() to directly use pwrite() and pread()
|
|
||||||
* instead of prw().
|
|
||||||
*/
|
*/
|
||||||
static ssize_t
|
static ssize_t
|
||||||
rw_file_exact(int fd, uint8_t *mem, size_t len,
|
rw_file_exact(int fd, uint8_t *mem, size_t len,
|
||||||
@@ -1666,6 +1655,7 @@ prw(int fd, void *mem, size_t nrw,
|
|||||||
ssize_t r;
|
ssize_t r;
|
||||||
int saved_errno;
|
int saved_errno;
|
||||||
int prw_type;
|
int prw_type;
|
||||||
|
int flags;
|
||||||
|
|
||||||
prw_type = rw_type ^ IO_PREAD;
|
prw_type = rw_type ^ IO_PREAD;
|
||||||
|
|
||||||
@@ -1673,6 +1663,18 @@ prw(int fd, void *mem, size_t nrw,
|
|||||||
|| (unsigned int)prw_type > IO_WRITE)
|
|| (unsigned int)prw_type > IO_WRITE)
|
||||||
goto err_prw;
|
goto err_prw;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* O_APPEND must not be used, because this
|
||||||
|
* allows POSIX write() to ignore the
|
||||||
|
* current write offset and write at EOF,
|
||||||
|
* which would therefore break pread/pwrite
|
||||||
|
*/
|
||||||
|
flags = fcntl(fd, F_GETFL);
|
||||||
|
if (flags == -1)
|
||||||
|
return -1;
|
||||||
|
if (flags & O_APPEND)
|
||||||
|
goto err_prw;
|
||||||
|
|
||||||
if ((off_orig = lseek_eintr(fd, (off_t)0, SEEK_CUR)) == (off_t)-1)
|
if ((off_orig = lseek_eintr(fd, (off_t)0, SEEK_CUR)) == (off_t)-1)
|
||||||
return -1;
|
return -1;
|
||||||
if (lseek_eintr(fd, off, SEEK_SET) == (off_t)-1)
|
if (lseek_eintr(fd, off, SEEK_SET) == (off_t)-1)
|
||||||
|
|||||||
Reference in New Issue
Block a user