From 56e0ffa11319eebbe0d8b07502aa3ec8971435d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Jacke?= Date: Sat, 2 Mar 2019 05:39:54 +0100 Subject: xattr/setxattr: fix flag support on AIX AIX requires the flags to be 0, we need to do those checks manually. Signed-off-by: Bjoern Jacke Reviewed-by: Andrew Bartlett --- lib/replace/xattr.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/replace/xattr.c b/lib/replace/xattr.c index f142ed61723..b7fbde2a2ca 100644 --- a/lib/replace/xattr.c +++ b/lib/replace/xattr.c @@ -538,7 +538,21 @@ int rep_setxattr (const char *path, const char *name, const void *value, size_t return retval; #endif #elif defined(HAVE_XATTR_EA) - return setea(path, name, value, size, flags); + if (flags) { + retval = getea(path, name, NULL, 0); + if (retval < 0) { + if (flags & XATTR_REPLACE && errno == ENOATTR) { + return -1; + } + } else { + if (flags & XATTR_CREATE) { + errno = EEXIST; + return -1; + } + } + } + retval = setea(path, name, value, size, 0); + return retval; #elif defined(HAVE_XATTR_EXTATTR) int attrnamespace; const char *attrname; @@ -632,7 +646,21 @@ int rep_fsetxattr (int filedes, const char *name, const void *value, size_t size return retval; #endif #elif defined(HAVE_XATTR_EA) - return fsetea(filedes, name, value, size, flags); + if (flags) { + retval = fgetea(filedes, name, NULL, 0); + if (retval < 0) { + if (flags & XATTR_REPLACE && errno == ENOATTR) { + return -1; + } + } else { + if (flags & XATTR_CREATE) { + errno = EEXIST; + return -1; + } + } + } + retval = fsetea(filedes, name, value, size, 0); + return retval; #elif defined(HAVE_XATTR_EXTATTR) int attrnamespace; const char *attrname; -- cgit v1.2.1