xattr-util: merge various getxattr()/listxattr() helpers into getxattr_at_malloc() + listxattr_at_malloc()
Unfortunately fgetxattr() and flistxattr() don't work via O_PATH fds. Let's thus add fallbacks to go via /proc/self/fd/ in these cases. Also, let's merge all the various flavours we have here into singular implementations that can do everything we need: 1. malloc() loop handling 2. by fd, by path, or combination (i.e. a proper openat() like API) 3. work on O_PATH
This commit is contained in:
@@ -127,7 +127,7 @@ static int show_cgroup_name(
|
||||
bool delegate = false;
|
||||
int r;
|
||||
|
||||
r = getxattr_malloc(path, "trusted.delegate", &b, false);
|
||||
r = lgetxattr_malloc(path, "trusted.delegate", &b);
|
||||
if (r < 0) {
|
||||
if (r != -ENODATA)
|
||||
log_debug_errno(r, "Failed to read trusted.delegate extended attribute: %m");
|
||||
|
||||
@@ -334,7 +334,7 @@ static int image_make(
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
(void) fd_getcrtime_at(dfd, filename, &crtime, 0);
|
||||
(void) fd_getcrtime_at(dfd, filename, AT_SYMLINK_FOLLOW, &crtime);
|
||||
|
||||
if (!pretty) {
|
||||
r = extract_pretty(filename, ".raw", &pretty_buffer);
|
||||
|
||||
@@ -2765,7 +2765,7 @@ int verity_settings_load(
|
||||
* that doesn't exist for /usr */
|
||||
|
||||
if (designator < 0 || designator == PARTITION_ROOT) {
|
||||
r = getxattr_malloc(image, "user.verity.roothash", &text, true);
|
||||
r = getxattr_malloc(image, "user.verity.roothash", &text);
|
||||
if (r < 0) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
@@ -2794,7 +2794,7 @@ int verity_settings_load(
|
||||
* `usrhash`, because `usrroothash` or `rootusrhash` would just be too
|
||||
* confusing. We thus drop the reference to the root of the Merkle tree, and
|
||||
* just indicate which file system it's about. */
|
||||
r = getxattr_malloc(image, "user.verity.usrhash", &text, true);
|
||||
r = getxattr_malloc(image, "user.verity.usrhash", &text);
|
||||
if (r < 0) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ int mac_smack_read(const char *path, SmackAttr attr, char **label) {
|
||||
if (!mac_smack_use())
|
||||
return 0;
|
||||
|
||||
return getxattr_malloc(path, smack_attr_to_string(attr), label, true);
|
||||
return getxattr_malloc(path, smack_attr_to_string(attr), label);
|
||||
}
|
||||
|
||||
int mac_smack_read_fd(int fd, SmackAttr attr, char **label) {
|
||||
@@ -166,7 +166,7 @@ static int smack_fix_fd(int fd, const char *abspath, LabelFixFlags flags) {
|
||||
return 0;
|
||||
|
||||
/* If the old label is identical to the new one, suppress any kind of error */
|
||||
if (getxattr_malloc(FORMAT_PROC_FD_PATH(fd), "security.SMACK64", &old_label, false) >= 0 &&
|
||||
if (lgetxattr_malloc(FORMAT_PROC_FD_PATH(fd), "security.SMACK64", &old_label) >= 0 &&
|
||||
streq(old_label, label))
|
||||
return 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user