| From 5047e1697a00d2d7c9d053c4ece0118d61b5945f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Aug 2023 15:37:24 -0300 |
| Subject: apparmor: fix invalid reference on profile->disconnected |
| |
| From: Georgia Garcia <georgia.garcia@canonical.com> |
| |
| [ Upstream commit 8884ba07786c718771cf7b78cb3024924b27ec2b ] |
| |
| profile->disconnected was storing an invalid reference to the |
| disconnected path. Fix it by duplicating the string using |
| aa_unpack_strdup and freeing accordingly. |
| |
| Fixes: 72c8a768641d ("apparmor: allow profiles to provide info to disconnected paths") |
| Signed-off-by: Georgia Garcia <georgia.garcia@canonical.com> |
| Signed-off-by: John Johansen <john.johansen@canonical.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| security/apparmor/policy.c | 1 + |
| security/apparmor/policy_unpack.c | 5 +++-- |
| 2 files changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/security/apparmor/policy.c b/security/apparmor/policy.c |
| index fbdfcef91c616..c7b84fb568414 100644 |
| --- a/security/apparmor/policy.c |
| +++ b/security/apparmor/policy.c |
| @@ -218,6 +218,7 @@ void aa_free_profile(struct aa_profile *profile) |
| |
| aa_put_ns(profile->ns); |
| kfree_sensitive(profile->rename); |
| + kfree_sensitive(profile->disconnected); |
| |
| aa_free_file_rules(&profile->file); |
| aa_free_cap_rules(&profile->caps); |
| diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c |
| index fbddf6450195d..7012fd82f1bb1 100644 |
| --- a/security/apparmor/policy_unpack.c |
| +++ b/security/apparmor/policy_unpack.c |
| @@ -656,7 +656,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name) |
| const char *info = "failed to unpack profile"; |
| size_t ns_len; |
| struct rhashtable_params params = { 0 }; |
| - char *key = NULL; |
| + char *key = NULL, *disconnected = NULL; |
| struct aa_data *data; |
| int i, error = -EPROTO; |
| kernel_cap_t tmpcap; |
| @@ -710,7 +710,8 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name) |
| } |
| |
| /* disconnected attachment string is optional */ |
| - (void) aa_unpack_str(e, &profile->disconnected, "disconnected"); |
| + (void) aa_unpack_strdup(e, &disconnected, "disconnected"); |
| + profile->disconnected = disconnected; |
| |
| /* per profile debug flags (complain, audit) */ |
| if (!aa_unpack_nameX(e, AA_STRUCT, "flags")) { |
| -- |
| 2.42.0 |
| |