main: check that ACLs are supported in the lower layers

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2180118

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano 2023-03-23 23:01:25 +01:00
parent 25db5be78a
commit 2666df2a49
No known key found for this signature in database
GPG Key ID: 67E38F7A8BA21772
3 changed files with 20 additions and 2 deletions

View File

@ -206,6 +206,16 @@ direct_num_of_layers (const char *opaque, const char *path)
return 1;
}
static bool
direct_support_acls (struct ovl_layer *l)
{
char value[32];
return fgetxattr (l->fd, ACL_XATTR, value, sizeof (value)) >= 0
|| errno != ENOTSUP;
}
struct data_source direct_access_ds =
{
.num_of_layers = direct_num_of_layers,
@ -221,4 +231,5 @@ struct data_source direct_access_ds =
.getxattr = direct_getxattr,
.listxattr = direct_listxattr,
.readlinkat = direct_readlinkat,
.support_acls = direct_support_acls,
};

View File

@ -24,6 +24,8 @@
# include <stdbool.h>
# include <sys/types.h>
# define ACL_XATTR "system.posix_acl_default"
typedef struct hash_table Hash_table;
struct ovl_ino
@ -151,6 +153,7 @@ struct data_source
int (*listxattr)(struct ovl_layer *l, const char *path, char *buf, size_t size);
int (*getxattr)(struct ovl_layer *l, const char *path, const char *name, char *buf, size_t size);
ssize_t (*readlinkat)(struct ovl_layer *l, const char *path, char *buf, size_t bufsiz);
bool (*support_acls)(struct ovl_layer *l);
};
/* passthrough to the file system. */

8
main.c
View File

@ -66,8 +66,6 @@
#include <utils.h>
#include <plugin.h>
#define ACL_XATTR "system.posix_acl_default"
#ifndef TEMP_FAILURE_RETRY
#define TEMP_FAILURE_RETRY(expression) \
(__extension__ \
@ -5764,6 +5762,12 @@ main (int argc, char *argv[])
lo.layers = layers;
for (tmp_layer = layers; !lo.noacl && tmp_layer; tmp_layer = tmp_layer->next)
{
if (! tmp_layer->ds->support_acls (tmp_layer))
lo.noacl = 1;
}
if (lo.upperdir)
{
if (lo.xattr_permissions)