aboutsummaryrefslogtreecommitdiff
path: root/hw/9pfs
diff options
context:
space:
mode:
authorChristian Schoenebeck <qemu_oss@crudebyte.com>2022-04-29 12:25:22 +0200
committerChristian Schoenebeck <qemu_oss@crudebyte.com>2022-05-01 14:07:03 +0200
commit9ea3164611a63e898a979f2da24caa1abd29d906 (patch)
treec1b5241a93fb3c24c9e5f4bdab3913d7cf9b2e70 /hw/9pfs
parent951fe2f89f46f5d51eead066556edc7369e23915 (diff)
downloadqemu-9ea3164611a63e898a979f2da24caa1abd29d906.zip
qemu-9ea3164611a63e898a979f2da24caa1abd29d906.tar.gz
qemu-9ea3164611a63e898a979f2da24caa1abd29d906.tar.bz2
9pfs: fix removing non-existent POSIX ACL xattr on macOS host
When mapped POSIX ACL is used, we are ignoring errors when trying to remove a POSIX ACL xattr that does not exist. On Linux hosts we would get ENODATA in such cases, on macOS hosts however we get ENOATTR instead. As we can be sure that ENOATTR is defined as being identical on Linux hosts (at least by qemu/xattr.h), it is safe to fix this issue by simply comparing against ENOATTR instead of ENODATA. This patch fixes e.g. a command on Linux guest like: cp --preserve=mode old new Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com> Link: https://lore.kernel.org/qemu-devel/2866993.yOYK24bMf6@silver/ Reviewed-by: Greg Kurz <groug@kaod.org> Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com> Message-Id: <34f81e9bffd7a3e65fb7aab5b56c107bd0aac960.1651228001.git.qemu_oss@crudebyte.com>
Diffstat (limited to 'hw/9pfs')
-rw-r--r--hw/9pfs/9p-posix-acl.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c
index eadae27..4b2cb3c 100644
--- a/hw/9pfs/9p-posix-acl.c
+++ b/hw/9pfs/9p-posix-acl.c
@@ -65,7 +65,11 @@ static int mp_pacl_removexattr(FsContext *ctx,
int ret;
ret = local_removexattr_nofollow(ctx, path, MAP_ACL_ACCESS);
- if (ret == -1 && errno == ENODATA) {
+ /*
+ * macOS returns ENOATTR (!=ENODATA on macOS), whereas Linux returns
+ * ENODATA (==ENOATTR on Linux), so checking for ENOATTR is fine
+ */
+ if (ret == -1 && errno == ENOATTR) {
/*
* We don't get ENODATA error when trying to remove a
* posix acl that is not present. So don't throw the error
@@ -115,7 +119,11 @@ static int mp_dacl_removexattr(FsContext *ctx,
int ret;
ret = local_removexattr_nofollow(ctx, path, MAP_ACL_DEFAULT);
- if (ret == -1 && errno == ENODATA) {
+ /*
+ * macOS returns ENOATTR (!=ENODATA on macOS), whereas Linux returns
+ * ENODATA (==ENOATTR on Linux), so checking for ENOATTR is fine
+ */
+ if (ret == -1 && errno == ENOATTR) {
/*
* We don't get ENODATA error when trying to remove a
* posix acl that is not present. So don't throw the error