From a756a8ad1bc08030f076952e44f5e8b0e0c8d8d7 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Fri, 2 Oct 2020 15:15:52 -0500 Subject: [PATCH] kernel/fs: On write, relax address check on 0 length and NULL ptr * IEEE Std 1003.1-2017, read, write * golang performs a write of 0 length with a NULL buffer to "create" an empty file. We return BAD_ADDRESS for this. * If condition above occurs, continue as a length of 0 means we won't read the passed buffer. Change-Id: I8718abb92f5865a7b6f4fb7f2b74f803497ebef0 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3285 Reviewed-by: Alex von Gluck IV Reviewed-by: Adrien Destugues --- src/system/kernel/fs/fd.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/system/kernel/fs/fd.cpp b/src/system/kernel/fs/fd.cpp index a15b3b6e3b..607d416ba0 100644 --- a/src/system/kernel/fs/fd.cpp +++ b/src/system/kernel/fs/fd.cpp @@ -731,9 +731,6 @@ common_close(int fd, bool kernel) static ssize_t common_user_io(int fd, off_t pos, void* buffer, size_t length, bool write) { - if (!IS_USER_ADDRESS(buffer)) - return B_BAD_ADDRESS; - if (pos < -1) return B_BAD_VALUE; @@ -758,6 +755,12 @@ common_user_io(int fd, off_t pos, void* buffer, size_t length, bool write) return B_BAD_VALUE; } + if (length == 0) + return 0; + + if (!IS_USER_ADDRESS(buffer)) + return B_BAD_ADDRESS; + SyscallRestartWrapper status; if (write)