diff options
author | Ian Moffett <ian@osmora.org> | 2025-04-18 21:38:45 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-04-18 21:38:45 -0400 |
commit | ba4a5da7ec6c43fd965753f699fc08357e597291 (patch) | |
tree | d5f659095733d5fd37d817c08a152a1ed39a05ac | |
parent | 25837e0c189af9e90dbe6c249edf155ef8eccc43 (diff) |
kernel: descrip: Fix copyin/copyout + rw operation
Use ssize_t to avoid unsigned integer underflows and only call copyout()
during file reads
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r-- | sys/kern/kern_descrip.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 201db3e..d122e89 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -148,6 +148,7 @@ static int fd_rw(unsigned int fd, void *buf, size_t count, uint8_t write) { char *kbuf = NULL; + ssize_t n; struct filedesc *filedes; struct sio_txn sio; scret_t retval = 0; @@ -194,22 +195,21 @@ fd_rw(unsigned int fd, void *buf, size_t count, uint8_t write) } /* Call VFS write hook */ - if ((count = vfs_vop_write(filedes->vp, &sio)) < 0) { - retval = -EIO; + if ((n = vfs_vop_write(filedes->vp, &sio)) < 0) { + retval = n; goto done; } } else { - if ((count = vfs_vop_read(filedes->vp, &sio)) < 0) { - retval = -EIO; + if ((n = vfs_vop_read(filedes->vp, &sio)) < 0) { + retval = n; goto done; } - } - if (copyout(kbuf, buf, count) < 0) { - retval = -EFAULT; - goto done; + if (copyout(kbuf, buf, count) < 0) { + retval = -EFAULT; + goto done; + } } - retval = count; done: if (kbuf != NULL) { |