summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-10-07 12:42:46 -0400
committerIan Moffett <ian@osmora.org>2025-10-07 12:42:46 -0400
commit64c415819ba69da06a4e637e12880feda3653efb (patch)
tree922e5450aeba08367da1fbb04feece3db99bb587 /src
parenta2b0d7c7ac89383db6f76e866aab372517c21212 (diff)
kern: os: Verify access semantics in fd_write()
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src')
-rw-r--r--src/sys/os/os_filedes.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/sys/os/os_filedes.c b/src/sys/os/os_filedes.c
index 817bd47..6fa3e5a 100644
--- a/src/sys/os/os_filedes.c
+++ b/src/sys/os/os_filedes.c
@@ -30,6 +30,7 @@
#include <sys/syscall.h>
#include <sys/syslog.h>
#include <sys/errno.h>
+#include <sys/fcntl.h>
#include <sys/limits.h>
#include <sys/proc.h>
#include <sys/namei.h>
@@ -225,17 +226,33 @@ fdtab_init(struct proc *procp)
ssize_t
write(int fd, const void *buf, size_t count)
{
+ struct proc *self = proc_self();
+ struct filedesc *fdp;
int error;
char kbuf[1024];
+ if (self == NULL) {
+ return -ESRCH;
+ }
+
/* Must be valid */
error = proc_check_addr(proc_self(), (uintptr_t)buf, count);
if (error < 0) {
return error;
}
- memcpy(kbuf, buf, count);
+ /* Get the file descriptor structure */
+ fdp = fd_get(self, fd);
+ if (fdp == NULL) {
+ return -EBADF;
+ }
+ /* We need to be able to write it */
+ if ((fdp->mode & (O_WRONLY| O_RDWR)) == 0) {
+ return -EPERM;
+ }
+
+ memcpy(kbuf, buf, count);
switch (fd) {
case STDOUT_FILENO:
cons_putstr(