]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
vfs: add ENAMETOOLONG checks to path helpers in fs.c
authorTulio A M Mendes <[email protected]>
Thu, 11 Jun 2026 02:12:56 +0000 (23:12 -0300)
committerTulio A M Mendes <[email protected]>
Thu, 11 Jun 2026 02:12:56 +0000 (23:12 -0300)
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

index aab903c421af5072c406eb5ba71afe49d415b3d8..6b0647ee8e6c1baabcd180e8f60b5795d4eebe0d 100644 (file)
@@ -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) {