如果尝试将值设置为符号链接,则 lsetxattr 返回 EPERM

问题描述

我正在测试向 xattr 添加时间戳的简单程序。 lsetxattr 系统调用返回 EPERM 错误。这是预期的行为吗? 如何将 xattr 设置为符号链接,而不是跟随链接

#include <sys/types.h>
#include <attr/xattr.h>
#include <errno.h>
#include <time.h>
#include <stdio.h>

int main(int argc,char **argv){
    time_t t = time(NULL);
    if(lsetxattr(argv[1],"user.ts",&t,sizeof(time_t),0) == -1){
        perror(argv[1]);
    }
    return(0);
}

示例:

> ls -l a b c
-rw-r--r-- 1 saka users 0 Feb  1 09:08 a
-rw-r--r-- 1 saka users 0 Feb  1 09:08 b
lrwxrwxrwx 1 saka users 1 Feb  1 09:08 c -> b
> ./ts a
> ./ts c
c: Operation not permitted

我使用 xfs 或 ext3 在 3.10.0-862.14.4.el7.x86_64 上进行了测试。

解决方法

我猜是this

/*
 * In the user.* namespace,only regular files and directories can have
 * extended attributes. For sticky directories,only the owner and
 * privileged users can write attributes.
 */

事实上,尝试在符号链接上设置 trusted.foo 属性,以 lsetxattr(2) 作为 root 工作,而 user.fooEPERM 而失败。