From ad756016b9daf566a27fec1a2dd343cdeafdadd3 Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 29 May 2024 19:15:41 -0300 Subject: [PATCH] tmpfs: some more safety checks --- kernel-src/fs/tmpfs.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/kernel-src/fs/tmpfs.c b/kernel-src/fs/tmpfs.c index 4077c5cf..825eb425 100644 --- a/kernel-src/fs/tmpfs.c +++ b/kernel-src/fs/tmpfs.c @@ -209,6 +209,9 @@ static int tmpfs_unlink(vnode_t *node, char *name, cred_t *cred) { if (node->type != V_TYPE_DIR) return ENOTDIR; + if (node->vfsmounted) + return EBUSY; + size_t namelen = strlen(name); void *r; VOP_LOCK(node); @@ -242,6 +245,9 @@ 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) + return EISDIR; + tmpfsnode_t *tmpdir = (tmpfsnode_t *)dir; size_t namelen = strlen(name); void *v; @@ -299,7 +305,12 @@ static int tmpfs_rename(vnode_t *source, char *oldname, vnode_t *target, char *n else if (error == 0) // found oldnode = v; - // same link, rename is a no-op + if (node->vfsmounted || oldnode->vfsmounted) { + error = EBUSY; + goto cleanup; + } + + // same link, rename is a no-op TODO still gotta unlink it though if (sourcedir == targetdir && strcmp(oldname, newname) == 0) goto cleanup;