On Thu, 21 Apr 2022 17:07:55 +0200 Christian Schoenebeck <qemu_...@crudebyte.com> wrote:
> 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_...@crudebyte.com> > Link: https://lore.kernel.org/qemu-devel/2866993.yOYK24bMf6@silver/ > --- Reviewed-by: Greg Kurz <gr...@kaod.org> > hw/9pfs/9p-posix-acl.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/hw/9pfs/9p-posix-acl.c b/hw/9pfs/9p-posix-acl.c > index eadae270dd..4b2cb3c66c 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