[apparmor] [PATCH] apparmor: propagate -ENOMEM correctly in unpack_table
John Johansen
john.johansen at canonical.com
Wed Mar 18 05:52:22 UTC 2026
On 2/11/26 05:19, Maxime Bélair wrote:
> Currently, if the `kvzalloc` in `unpack_table` fails, it returns NULL.
> This is masked by `aa_dfa_unpack` which interprets NULL as a -EPROTO,
> leading to confusing error messages in `apparmor_parser` [1].
>
> The fixed behavior correctly propagates -ENOMEM on allocation failure.
>
> [1] https://gitlab.com/apparmor/apparmor/-/issues/592
>
> Signed-off-by: Maxime Bélair <maxime.belair at canonical.com>
Acked-by: John Johansen <john.johansen at canonical.com>
> ---
> security/apparmor/match.c | 20 ++++++++++++--------
> 1 file changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/security/apparmor/match.c b/security/apparmor/match.c
> index bbeb3be68572..6cca29c1f209 100644
> --- a/security/apparmor/match.c
> +++ b/security/apparmor/match.c
> @@ -33,7 +33,7 @@
> */
> static struct table_header *unpack_table(char *blob, size_t bsize)
> {
> - struct table_header *table = NULL;
> + struct table_header *table = ERR_PTR(-EPROTO);
> struct table_header th;
> size_t tsize;
>
> @@ -74,20 +74,21 @@ static struct table_header *unpack_table(char *blob, size_t bsize)
> else if (th.td_flags == YYTD_DATA32)
> UNPACK_ARRAY(table->td_data, blob, th.td_lolen,
> u32, __be32, get_unaligned_be32);
> - else
> - goto fail;
> + else {
> + kvfree(table);
> + table = ERR_PTR(-EPROTO);
> + goto out;
> + }
> /* if table was vmalloced make sure the page tables are synced
> * before it is used, as it goes live to all cpus.
> */
> if (is_vmalloc_addr(table))
> vm_unmap_aliases();
> - }
> + } else
> + table = ERR_PTR(-ENOMEM);
>
> out:
> return table;
> -fail:
> - kvfree(table);
> - return NULL;
> }
>
> /**
> @@ -343,8 +344,11 @@ struct aa_dfa *aa_dfa_unpack(void *blob, size_t size, int flags)
>
> while (size > 0) {
> table = unpack_table(data, size);
> - if (!table)
> + if (IS_ERR(table)) {
> + error = PTR_ERR(table);
> + table = NULL;
> goto fail;
> + }
>
> switch (table->td_id) {
> case YYTD_ID_ACCEPT:
More information about the AppArmor
mailing list