fix: 修复内核access chmod chown接口

1、修复内核的access chmod chown功能;
2、此三个接口的syscall直接调用内核态接口执行操作。

close #I3Z5L6

Signed-off-by: chenjing <chenjing139@huawei.com>
Change-Id: I301f00fb341252b697b04b9970db86f0e7f978df
This commit is contained in:
chenjing 2021-07-05 16:03:16 +08:00
parent 003810284c
commit 56a95b9ec9
2 changed files with 55 additions and 49 deletions

View File

@ -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;
}

View File

@ -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 = access(pathRet, amode);
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 = -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();
}