From b13b3171729141ce9e0130721448ee3032700189 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 30 May 2024 10:18:44 -0300 Subject: [PATCH] fs: added some checks --- kernel-src/fs/ext2.c | 21 +++++++++++++++++++++ kernel-src/fs/pipefs.c | 1 + kernel-src/fs/tmpfs.c | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/kernel-src/fs/ext2.c b/kernel-src/fs/ext2.c index c67f3b20..77b34b7c 100644 --- a/kernel-src/fs/ext2.c +++ b/kernel-src/fs/ext2.c @@ -1150,6 +1150,9 @@ static int ext2_getdents(vnode_t *vnode, dent_t *buffer, size_t count, uintmax_t ext2node_t *node = (ext2node_t *)vnode; ext2fs_t *fs = (ext2fs_t *)node->vnode.vfs; + if (vnode->type != V_TYPE_DIR) + return ENOTDIR; + VOP_LOCK(vnode); int err = 0; @@ -1231,6 +1234,12 @@ static int ext2_readlink(vnode_t *vnode, char **link, cred_t *cred) { } static int ext2_read(vnode_t *vnode, void *buffer, size_t size, uintmax_t offset, int flags, size_t *readc, cred_t *cred) { + if (vnode->type == V_TYPE_DIR) + return EISDIR; + + if (vnode->type != V_TYPE_REGULAR) + return EINVAL; + ext2node_t *node = (ext2node_t *)vnode; ext2fs_t *fs = (ext2fs_t *)vnode->vfs; uintmax_t endoffset = offset + size; @@ -1266,6 +1275,12 @@ static int ext2_read(vnode_t *vnode, void *buffer, size_t size, uintmax_t offset } int ext2_write(vnode_t *vnode, void *buffer, size_t size, uintmax_t offset, int flags, size_t *writec, cred_t *cred) { + if (vnode->type == V_TYPE_DIR) + return EISDIR; + + if (vnode->type != V_TYPE_REGULAR) + return EINVAL; + ext2node_t *node = (ext2node_t *)vnode; ext2fs_t *fs = (ext2fs_t *)vnode->vfs; uintmax_t endoffset = offset + size; @@ -1300,6 +1315,12 @@ int ext2_write(vnode_t *vnode, void *buffer, size_t size, uintmax_t offset, int } int ext2_resize(vnode_t *vnode, size_t newsize, cred_t *cred) { + if (vnode->type == V_TYPE_DIR) + return EISDIR; + + if (vnode->type != V_TYPE_REGULAR) + return EINVAL; + __assert(vnode->type == V_TYPE_REGULAR); ext2node_t *node = (ext2node_t *)vnode; ext2fs_t *fs = (ext2fs_t *)vnode->vfs; diff --git a/kernel-src/fs/pipefs.c b/kernel-src/fs/pipefs.c index aa63da3d..cb05f0af 100644 --- a/kernel-src/fs/pipefs.c +++ b/kernel-src/fs/pipefs.c @@ -55,6 +55,7 @@ int pipefs_close(vnode_t *node, int flags, cred_t *cred) { return 0; } +// TODO for pipefs_read and pipefs_write, the return actually depends on how much data is in the pipe static int internalpoll(vnode_t *node, polldata_t *data, int events) { pipenode_t *pipenode = (pipenode_t *)node; int revents = 0; diff --git a/kernel-src/fs/tmpfs.c b/kernel-src/fs/tmpfs.c index 825eb425..9c6caf96 100644 --- a/kernel-src/fs/tmpfs.c +++ b/kernel-src/fs/tmpfs.c @@ -245,7 +245,7 @@ static int tmpfs_link(vnode_t *node, vnode_t *dir, char *name, cred_t *cred) { if (dir->type != V_TYPE_DIR) return ENOTDIR; - if (node->tyƩ == V_TYPE_DIR) + if (node->vfs == V_TYPE_DIR) return EISDIR; tmpfsnode_t *tmpdir = (tmpfsnode_t *)dir;