We aren't expecting a null path mnt pointer here, and file_mnt_idmap
dereferences it without checking for null, leading to a null pointer
dereference BUG print. Instead, explicitly check for this via AA_BUG
line in order to get more useful diagnostics.

Signed-off-by: Ryan Lee <ryan....@canonical.com>
---
 security/apparmor/lsm.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index 45cc81234c0d..d0facedb1cfd 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -649,12 +649,23 @@ static int apparmor_file_open(struct file *file)
 
        label = aa_get_newest_cred_label_condref(file->f_cred, &needput);
        if (!unconfined(label)) {
-               struct mnt_idmap *idmap = file_mnt_idmap(file);
-               struct inode *inode = file_inode(file);
+               struct mnt_idmap *idmap;
+               struct inode *inode;
                vfsuid_t vfsuid;
+               /* Set a dummy value to default-initialize the rest, and then
+                * write the correct value to mode once we have an inode ptr.
+                * Unfortunately, default-initializing everything with {} is
+                * only supported since C23.
+                */
                struct path_cond cond = {
-                       .mode = inode->i_mode,
+                       .mode = 0
                };
+
+               AA_BUG(!(file->f_path.mnt));
+               idmap = file_mnt_idmap(file);
+               inode = file_inode(file);
+               cond.mode = inode->i_mode;
+
                vfsuid = i_uid_into_vfsuid(idmap, inode);
                cond.uid = vfsuid_into_kuid(vfsuid);
 
-- 
2.43.0

base-kernel: v6.14-rc6

Reply via email to