From 26ab0d051c56a0cf0b0b80db465d13b8a5a4fa60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 31 Oct 2020 14:51:28 +0100 Subject: [PATCH] kernel/fs: update position when user writing with O_APPEND MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit when appending, pos is passed unchanged to the write hook. fix #16506 Change-Id: I102e8e00e635d7a32cf50f09d8bd3d28dc235f9b Reviewed-on: https://review.haiku-os.org/c/haiku/+/3373 Reviewed-by: Jérôme Duval --- src/system/kernel/fs/fd.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/system/kernel/fs/fd.cpp b/src/system/kernel/fs/fd.cpp index 91fe26c08b..ac94ff77e3 100644 --- a/src/system/kernel/fs/fd.cpp +++ b/src/system/kernel/fs/fd.cpp @@ -748,7 +748,7 @@ common_user_io(int fd, off_t pos, void* buffer, size_t length, bool write) } bool movePosition = false; - if (pos == -1) { + if (pos == -1 && (!write || (descriptor->open_mode & O_APPEND) == 0)) { pos = descriptor->pos; movePosition = true; } @@ -770,6 +770,8 @@ common_user_io(int fd, off_t pos, void* buffer, size_t length, bool write) if (movePosition) descriptor->pos = pos + length; + else if (pos == -1) + descriptor->pos = descriptor->ops->fd_seek(descriptor, 0, SEEK_END); return length <= SSIZE_MAX ? (ssize_t)length : SSIZE_MAX; } @@ -808,7 +810,7 @@ common_user_vector_io(int fd, off_t pos, const iovec* userVecs, size_t count, return B_BAD_ADDRESS; bool movePosition = false; - if (pos == -1) { + if (pos == -1 && (!write || (descriptor->open_mode & O_APPEND) == 0)) { pos = descriptor->pos; movePosition = true; } @@ -852,7 +854,8 @@ common_user_vector_io(int fd, off_t pos, const iovec* userVecs, size_t count, else bytesTransferred += (ssize_t)length; - pos += length; + if (pos > -1) + pos += length; if (length < vecs[i].iov_len) break; @@ -860,6 +863,8 @@ common_user_vector_io(int fd, off_t pos, const iovec* userVecs, size_t count, if (movePosition) descriptor->pos = pos; + else if (pos == -1) + descriptor->pos = descriptor->ops->fd_seek(descriptor, 0, SEEK_END); return bytesTransferred; }