code:access - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 检查 指定文件 的权限,并抛出相关错误
    • 若尝试写 只读的文件系统,则抛出EROFS
    • 若尝试写 作为程序正文的文件,则抛出ETXTBSY
    • 若 超级用户 尝试执行无执行权限的文件,则抛出EACCES
    • 若 当前用户 无相应权限,则抛出EACCES
  • 共传入2个参数 aip , mode
    • aip : 指定文件的struct inode结构
    • mode : 需要验证的权限,权限常量定义在inode.h
  • 返回值
    • 若验证通过,返回0
    • 若失败,返回1

6730

6731 /*

6732  * Check mode permission on inode pointer.

6733  * Mode is READ, WRITE, or EXEC.

6734  * In the case of WRITE, the

6735  * read-only status of the file

6736  * system is checked.

6737  * Also in WRITE, prototype text

6738  * segments cannot be written.

6739  * The mode is shifted to select

6740  * the owner/group/other fields.

6741  * The super user is granted all

6742  * permissions except for EXEC where

6743  * at least one of the EXEC bits must

6744  * be on.

6745  */

6746 access(aip, mode)

6747 int *aip;

6748 {

  • IWRITE,IEXEC,IREAD 权限常量定义在inode.h
6749     register *ip, m;

6750

6751     ip = aip;

6752     m = mode;

6753     if(m == IWRITE) {

6754          if(getfs(ip->i_dev)->s_ronly != 0) {

6755           u.u_error = EROFS;

6756           return(1);

6757          }

  • 若尝试写 只读的文件系统,则抛出EROFS
6758          if(ip->i_flag & ITEXT) {

6759           u.u_error = ETXTBSY;

6760           return(1);

6761          }

  • 若尝试写 作为程序正文的文件,则抛出ETXTBSY
6762     }

6763     if(u.u_uid == 0) {

6764          if(m == IEXEC && (ip->i_mode &

6765                     (IEXEC | (IEXEC>>3) | (IEXEC>>6))) == 0)

6766           goto bad;

6767          return(0);

6768     }

  • 当前用户为超级用户
    • 若尝试执行无执行权限的文件,则抛出EACCES
    • 其他情况,超级用户拥有完全权限
6769     if(u.u_uid != ip->i_uid) {

6770          m =>> 3;

6771          if(u.u_gid != ip->i_gid)

6772           m =>> 3;

6773     }

6774     if((ip->i_mode&m) != 0)

6775          return(0);

  • 若 当前用户 为 文件拥有者,则 文件权限 对比 拥有者权限
    • 否则,若 当前用户 属于 文件拥有组,则 文件权限 对比 拥有组权限
      • 否则,文件权限 对比 其他用户权限
  • 若验证通过,则返回0,否则抛出EACCES
6776

6777 bad:

6778     u.u_error = EACCES;

6779     return(1);

6780 }

6781 /* ------------------------- */

Ref

Caller

⚠️ **GitHub.com Fallback** ⚠️