summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-04-18 21:38:45 -0400
committerIan Moffett <ian@osmora.org>2025-04-18 21:38:45 -0400
commitba4a5da7ec6c43fd965753f699fc08357e597291 (patch)
treed5f659095733d5fd37d817c08a152a1ed39a05ac /sys
parent25837e0c189af9e90dbe6c249edf155ef8eccc43 (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>
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_descrip.c18
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) {