mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-16 01:54:00 +00:00
acl: Annotate struct posix_acl with __counted_by()
Add the __counted_by compiler attribute to the flexible array member a_entries to improve access bounds-checking via CONFIG_UBSAN_BOUNDS and CONFIG_FORTIFY_SOURCE. Use struct_size() to calculate the number of bytes to allocate for new and cloned acls and remove the local size variables. Change the posix_acl_alloc() function parameter count from int to unsigned int to match posix_acl's a_count data type. Add identifier names to the function definition to silence two checkpatch warnings. Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev> Link: https://lore.kernel.org/r/20241018121426.155247-2-thorsten.blum@linux.dev Cc: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
99bdadbde9
commit
8c6e03ffed
@ -200,11 +200,11 @@ EXPORT_SYMBOL(posix_acl_init);
|
|||||||
* Allocate a new ACL with the specified number of entries.
|
* Allocate a new ACL with the specified number of entries.
|
||||||
*/
|
*/
|
||||||
struct posix_acl *
|
struct posix_acl *
|
||||||
posix_acl_alloc(int count, gfp_t flags)
|
posix_acl_alloc(unsigned int count, gfp_t flags)
|
||||||
{
|
{
|
||||||
const size_t size = sizeof(struct posix_acl) +
|
struct posix_acl *acl;
|
||||||
count * sizeof(struct posix_acl_entry);
|
|
||||||
struct posix_acl *acl = kmalloc(size, flags);
|
acl = kmalloc(struct_size(acl, a_entries, count), flags);
|
||||||
if (acl)
|
if (acl)
|
||||||
posix_acl_init(acl, count);
|
posix_acl_init(acl, count);
|
||||||
return acl;
|
return acl;
|
||||||
@ -220,9 +220,8 @@ posix_acl_clone(const struct posix_acl *acl, gfp_t flags)
|
|||||||
struct posix_acl *clone = NULL;
|
struct posix_acl *clone = NULL;
|
||||||
|
|
||||||
if (acl) {
|
if (acl) {
|
||||||
int size = sizeof(struct posix_acl) + acl->a_count *
|
clone = kmemdup(acl, struct_size(acl, a_entries, acl->a_count),
|
||||||
sizeof(struct posix_acl_entry);
|
flags);
|
||||||
clone = kmemdup(acl, size, flags);
|
|
||||||
if (clone)
|
if (clone)
|
||||||
refcount_set(&clone->a_refcount, 1);
|
refcount_set(&clone->a_refcount, 1);
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ struct posix_acl {
|
|||||||
refcount_t a_refcount;
|
refcount_t a_refcount;
|
||||||
unsigned int a_count;
|
unsigned int a_count;
|
||||||
struct rcu_head a_rcu;
|
struct rcu_head a_rcu;
|
||||||
struct posix_acl_entry a_entries[];
|
struct posix_acl_entry a_entries[] __counted_by(a_count);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FOREACH_ACL_ENTRY(pa, acl, pe) \
|
#define FOREACH_ACL_ENTRY(pa, acl, pe) \
|
||||||
@ -62,7 +62,7 @@ posix_acl_release(struct posix_acl *acl)
|
|||||||
/* posix_acl.c */
|
/* posix_acl.c */
|
||||||
|
|
||||||
extern void posix_acl_init(struct posix_acl *, int);
|
extern void posix_acl_init(struct posix_acl *, int);
|
||||||
extern struct posix_acl *posix_acl_alloc(int, gfp_t);
|
extern struct posix_acl *posix_acl_alloc(unsigned int count, gfp_t flags);
|
||||||
extern struct posix_acl *posix_acl_from_mode(umode_t, gfp_t);
|
extern struct posix_acl *posix_acl_from_mode(umode_t, gfp_t);
|
||||||
extern int posix_acl_equiv_mode(const struct posix_acl *, umode_t *);
|
extern int posix_acl_equiv_mode(const struct posix_acl *, umode_t *);
|
||||||
extern int __posix_acl_create(struct posix_acl **, gfp_t, umode_t *);
|
extern int __posix_acl_create(struct posix_acl **, gfp_t, umode_t *);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user