patch file systems with the acl checks
[lunaix-os.git] / lunaix-os / kernel / fs / vfs.c
index 1696d6e961ace4b3ac092809db67cd9dddd42183..53faa560341f16b55ecb6964946d42b16880431b 100644 (file)
@@ -192,12 +192,12 @@ vfs_dcache_rehash(struct v_dnode* new_parent, struct v_dnode* dnode)
 int
 vfs_open(struct v_dnode* dnode, struct v_file** file)
 {
 int
 vfs_open(struct v_dnode* dnode, struct v_file** file)
 {
-    if (!dnode->inode || !dnode->inode->ops->open) {
+    struct v_inode* inode = dnode->inode;
+    
+    if (!inode || !inode->ops->open) {
         return ENOTSUP;
     }
 
         return ENOTSUP;
     }
 
-    struct v_inode* inode = dnode->inode;
-
     lock_inode(inode);
 
     struct v_file* vfile = cake_grab(file_pile);
     lock_inode(inode);
 
     struct v_file* vfile = cake_grab(file_pile);
@@ -846,6 +846,11 @@ __DEFINE_LXSYSCALL3(int, read, int, fd, void*, buf, size_t, count)
         goto done;
     }
 
         goto done;
     }
 
+    if (!check_allow_read(file->inode)) {
+        errno = EPERM;
+        goto done;
+    }
+
     lock_inode(file->inode);
 
     file->inode->atime = clock_unixtime();
     lock_inode(file->inode);
 
     file->inode->atime = clock_unixtime();
@@ -932,6 +937,11 @@ __DEFINE_LXSYSCALL3(int, lseek, int, fd, int, offset, int, options)
         goto done;
     }
 
         goto done;
     }
 
+    if (!check_allow_read(inode)) {
+        errno = EPERM;
+        goto done;
+    }
+
     lock_inode(inode);
 
     int overflow = 0;
     lock_inode(inode);
 
     int overflow = 0;
@@ -1012,6 +1022,10 @@ vfs_readlink(struct v_dnode* dnode, char* buf, size_t size)
         return ENOTSUP;
     }
 
         return ENOTSUP;
     }
 
+    if (!check_allow_read(inode)) {
+        return EPERM;
+    }
+
     lock_inode(inode);
 
     int errno = inode->ops->read_symlink(inode, &link);
     lock_inode(inode);
 
     int errno = inode->ops->read_symlink(inode, &link);