From dd0297e956d1296469878098cef0a6af4ac02de1 Mon Sep 17 00:00:00 2001 From: Tulio A M Mendes Date: Wed, 10 Jun 2026 23:12:56 -0300 Subject: [PATCH] vfs: add ENAMETOOLONG checks to path helpers in fs.c Implement L1: standardize ENAMETOOLONG across all path helpers. Added path length checks (PATH_MAX = 128) to: - vfs_lookup_depth(): Check path length before lookup - vfs_lookup_parent(): Check path length before parent lookup - vfs_mkdirp(): Check path length before recursive mkdir These functions now return NULL or -ENAMETOOLONG when paths exceed 128 characters, matching the behavior already present in syscall.c helpers (copy_user_cstr, path_resolve_user). Test: make test-battery PASS (157/157), make analyzer PASS --- src/kernel/fs.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/kernel/fs.c b/src/kernel/fs.c index aab903c4..6b0647ee 100644 --- a/src/kernel/fs.c +++ b/src/kernel/fs.c @@ -389,6 +389,10 @@ static fs_node_t* vfs_lookup_depth(const char* path, int depth, int lookup_flags if (!path) return NULL; if (depth > 8) return NULL; + /* L1: Check path length against PATH_MAX (128) */ + size_t path_len = strlen(path); + if (path_len >= 128) return NULL; /* ENAMETOOLONG */ + /* Snapshot mount-table state under the VFS lock so that concurrent * mount/umount/pivot_root on another CPU cannot corrupt our view. */ uintptr_t fl = spin_lock_irqsave(&g_vfs_lock); @@ -463,6 +467,10 @@ fs_node_t* vfs_lookup_parent(const char* path, char* name_out, size_t name_sz) { if (!path || !name_out || name_sz == 0) return NULL; name_out[0] = 0; + /* L1: Check total path length against PATH_MAX (128) */ + size_t path_len = strlen(path); + if (path_len >= 128) return NULL; /* ENAMETOOLONG */ + /* Find last '/' separator */ const char* last_slash = NULL; for (const char* p = path; *p; p++) { @@ -524,6 +532,10 @@ int vfs_mkdir(const char* path) { int vfs_mkdirp(const char* path) { if (!path || path[0] != '/') return -EINVAL; + /* L1: Check path length against PATH_MAX (128) */ + size_t path_len = strlen(path); + if (path_len >= 128) return -ENAMETOOLONG; + /* Check if it already exists */ fs_node_t* node = vfs_lookup(path); if (node) { -- 2.43.0