This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 89df084b0e51593643ccc2f6427ac11c99243295
Author: wangjianyu3 <wangjian...@xiaomi.com>
AuthorDate: Wed Jun 4 12:46:16 2025 +0800

    fs/vfs: check if all `iov_base` are accessible
    
    Check if all `iov_base` are inside accessible address space.
    
    Signed-off-by: wangjianyu3 <wangjian...@xiaomi.com>
---
 fs/vfs/fs_read.c  | 14 +++++++++++++-
 fs/vfs/fs_write.c | 13 ++++++++++++-
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/fs/vfs/fs_read.c b/fs/vfs/fs_read.c
index f21107182b..0c99509cba 100644
--- a/fs/vfs/fs_read.c
+++ b/fs/vfs/fs_read.c
@@ -159,11 +159,23 @@ ssize_t file_readv(FAR struct file *filep,
                    FAR const struct iovec *iov, int iovcnt)
 {
   FAR struct inode *inode;
-  ssize_t ret = -EBADF;
+  ssize_t ret;
 
   DEBUGASSERT(filep);
   inode = filep->f_inode;
 
+  /* Are all iov_base accessible? */
+
+  for (ret = 0; ret < iovcnt; ret++)
+    {
+      if (iov[ret].iov_base == NULL && iov[ret].iov_len != 0)
+        {
+          return -EFAULT;
+        }
+    }
+
+  ret = -EBADF;
+
   /* Was this file opened for read access? */
 
   if ((filep->f_oflags & O_RDOK) == 0)
diff --git a/fs/vfs/fs_write.c b/fs/vfs/fs_write.c
index 22195de380..896e256040 100644
--- a/fs/vfs/fs_write.c
+++ b/fs/vfs/fs_write.c
@@ -144,7 +144,7 @@ ssize_t file_writev(FAR struct file *filep,
                     FAR const struct iovec *iov, int iovcnt)
 {
   FAR struct inode *inode;
-  ssize_t ret = -EBADF;
+  ssize_t ret;
 
   /* Was this file opened for write access? */
 
@@ -153,10 +153,21 @@ ssize_t file_writev(FAR struct file *filep,
       return -EACCES;
     }
 
+  /* Are all iov_base accessible? */
+
+  for (ret = 0; ret < iovcnt; ret++)
+    {
+      if (iov[ret].iov_base == NULL && iov[ret].iov_len != 0)
+        {
+          return -EFAULT;
+        }
+    }
+
   /* Is a driver registered? Does it support the write method?
    * If yes, then let the driver perform the write.
    */
 
+  ret = -EBADF;
   inode = filep->f_inode;
   if (inode != NULL && inode->u.i_ops)
     {

Reply via email to