From 56a95b9ec903f815f9199ac65ca318e00a83b2ed Mon Sep 17 00:00:00 2001 From: chenjing Date: Mon, 5 Jul 2021 16:03:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=86=85=E6=A0=B8acce?= =?UTF-8?q?ss=20chmod=20chown=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复内核的access chmod chown功能; 2、此三个接口的syscall直接调用内核态接口执行操作。 close #I3Z5L6 Signed-off-by: chenjing Change-Id: I301f00fb341252b697b04b9970db86f0e7f978df --- fs/vfs/operation/fs_other.c | 60 +++++++++++++++++++++++++++++++------ syscall/fs_syscall.c | 44 +++------------------------ 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/fs/vfs/operation/fs_other.c b/fs/vfs/operation/fs_other.c index 791accb9..bb5b0e55 100644 --- a/fs/vfs/operation/fs_other.c +++ b/fs/vfs/operation/fs_other.c @@ -35,7 +35,9 @@ #include "dirent.h" #include "unistd.h" #include "sys/select.h" +#include "sys/mount.h" #include "sys/stat.h" +#include "sys/statfs.h" #include "sys/prctl.h" #include "fs/fd_table.h" #include "fs/file.h" @@ -256,30 +258,70 @@ char *getcwd(char *buf, size_t n) int chmod(const char *path, mode_t mode) { - int result; - struct stat buf; + struct IATTR attr = {0}; + attr.attr_chg_mode = mode; + attr.attr_chg_valid = CHG_MODE; /* change mode */ + int ret; - result = stat(path, &buf); - if (result != ENOERR) { + ret = chattr(path, &attr); + if (ret < 0) { + return VFS_ERROR; + } + + return OK; +} + +int chown(const char *pathname, uid_t owner, gid_t group) +{ + struct IATTR attr = {0}; + attr.attr_chg_valid = 0; + int ret; + + if (owner != (uid_t)-1) { + attr.attr_chg_uid = owner; + attr.attr_chg_valid |= CHG_UID; + } + if (group != (gid_t)-1) { + attr.attr_chg_gid = group; + attr.attr_chg_valid |= CHG_GID; + } + ret = chattr(pathname, &attr); + if (ret < 0) { return VFS_ERROR; } - /* no access/permission control for files now, just return OK if stat is okay*/ return OK; } int access(const char *path, int amode) { - int result; + int ret; struct stat buf; + struct statfs fsBuf; - result = stat(path, &buf); + ret = statfs(path, &fsBuf); + if (ret != 0) { + if (get_errno() != ENOSYS) { + return VFS_ERROR; + } + /* dev has no statfs ops, need devfs to handle this in feature */ + } - if (result != ENOERR) { + if ((fsBuf.f_flags & MS_RDONLY) && ((unsigned int)amode & W_OK)) { + set_errno(EROFS); + return VFS_ERROR; + } + + ret = stat(path, &buf); + if (ret != 0) { + return VFS_ERROR; + } + + if (VfsPermissionCheck(buf.st_uid, buf.st_gid, buf.st_mode, amode)) { + set_errno(EACCES); return VFS_ERROR; } - /* no access/permission control for files now, just return OK if stat is okay*/ return OK; } diff --git a/syscall/fs_syscall.c b/syscall/fs_syscall.c index 9bb01f3a..b424b05b 100644 --- a/syscall/fs_syscall.c +++ b/syscall/fs_syscall.c @@ -703,8 +703,6 @@ OUT: int SysAccess(const char *path, int amode) { int ret; - struct stat buf; - struct statfs fsBuf; char *pathRet = NULL; if (path != NULL) { @@ -714,30 +712,9 @@ int SysAccess(const char *path, int amode) } } - ret = statfs((path ? pathRet : NULL), &fsBuf); - if (ret != 0) { - ret = -get_errno(); - if (ret != -ENOSYS) { - goto OUT; - } else { - /* dev has no statfs ops, need devfs to handle this in feature */ - ret = LOS_OK; - } - } - - if ((fsBuf.f_flags & MS_RDONLY) && ((unsigned int)amode & W_OK)) { - ret = -EROFS; - goto OUT; - } - - ret = stat((path ? pathRet : NULL), &buf); - if (ret != 0) { + ret = access(pathRet, amode); + if (ret < 0) { ret = -get_errno(); - goto OUT; - } - - if (VfsPermissionCheck(buf.st_uid, buf.st_gid, buf.st_mode, amode)) { - ret = -EACCES; } OUT: @@ -2149,9 +2126,6 @@ OUT: int SysChmod(const char *pathname, mode_t mode) { - struct IATTR attr = {0}; - attr.attr_chg_mode = mode; - attr.attr_chg_valid = CHG_MODE; /* change mode */ int ret; char *pathRet = NULL; @@ -2162,7 +2136,7 @@ int SysChmod(const char *pathname, mode_t mode) } } - ret = chattr((pathname ? pathRet : NULL), &attr); + ret = chmod(pathRet, mode); if (ret < 0) { ret = -get_errno(); } @@ -2176,8 +2150,6 @@ OUT: int SysChown(const char *pathname, uid_t owner, gid_t group) { - struct IATTR attr = {0}; - attr.attr_chg_valid = 0; int ret; char *pathRet = NULL; @@ -2188,15 +2160,7 @@ int SysChown(const char *pathname, uid_t owner, gid_t group) } } - if (owner != (uid_t)-1) { - attr.attr_chg_uid = owner; - attr.attr_chg_valid |= CHG_UID; - } - if (group != (gid_t)-1) { - attr.attr_chg_gid = group; - attr.attr_chg_valid |= CHG_GID; - } - ret = chattr((pathname ? pathRet : NULL), &attr); + ret = chown(pathRet, owner, group); if (ret < 0) { ret = -get_errno(); } -- GitLab