summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordzwdz2024-08-15 21:29:54 +0200
committerdzwdz2024-08-15 21:40:20 +0200
commitf1bab6b74d84b972a9e817e5028b8e438bf5e83d (patch)
treea37491e8c8448b47922924294866b6dcc01b6deb
parent4f8bb6643aa097008341b044e67991e3ec039f38 (diff)
kernel: disallow NUL bytes in paths
-rw-r--r--man/open.22
-rw-r--r--src/kernel/syscalls.c8
-rw-r--r--src/libc/fs/misc.c1
3 files changed, 10 insertions, 1 deletions
diff --git a/man/open.2 b/man/open.2
index 3cc18b3..2de7abc 100644
--- a/man/open.2
+++ b/man/open.2
@@ -21,6 +21,8 @@ tries to open the file located at
which is a string of length
.Fa len ,
potentially returning a new handle.
+.Fa path
+can't contain any NUL bytes.
The call will be handled by the most recent mount that contains the given path,
according to the definition in
.Xr path 7 .
diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c
index e94f886..a6c807c 100644
--- a/src/kernel/syscalls.c
+++ b/src/kernel/syscalls.c
@@ -73,6 +73,14 @@ hid_t _sys_open(const char __user *path, long len, int flags) {
goto fail;
}
+ /* I used to allow NUL in paths. Now I don't, but I want to keep the same
+ * API -- so let's reject paths with NUL in them. */
+ for (long i = 0; i < len; i++) {
+ if (path_buf[i] == '\0') {
+ goto fail;
+ }
+ }
+
len = path_simplify(path_buf, path_buf, len);
if (len == 0) goto fail;
diff --git a/src/libc/fs/misc.c b/src/libc/fs/misc.c
index d7013e8..67277bf 100644
--- a/src/libc/fs/misc.c
+++ b/src/libc/fs/misc.c
@@ -147,7 +147,6 @@ hid_t ufs_wait(char *buf, size_t len, struct ufs_request *req) {
continue;
}
buf[req->len] = '\0';
- // TODO ensure passed paths don't have null bytes in them in the kernel
}
break;
}