diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c index e86b731b9457..872b96fd574e 100644 --- a/security/apparmor/apparmorfs.c +++ b/security/apparmor/apparmorfs.c @@ -1216,6 +1216,9 @@ static int aa_sfs_seq_show(struct seq_file *seq, void *v) case AA_SFS_TYPE_U64: seq_printf(seq, "%#08lx\n", fs_file->v.u64); break; + case AA_SFS_TYPE_INTPTR: + seq_printf(seq, "%d\n", READ_ONCE(*fs_file->v.intptr)); + break; default: /* Ignore unpritable entry types. */ break; diff --git a/security/apparmor/include/apparmorfs.h b/security/apparmor/include/apparmorfs.h index a21855ad7fb8..3f954194a0e7 100644 --- a/security/apparmor/include/apparmorfs.h +++ b/security/apparmor/include/apparmorfs.h @@ -17,6 +17,7 @@ enum aa_sfs_type { AA_SFS_TYPE_BOOLEAN, AA_SFS_TYPE_STRING, AA_SFS_TYPE_U64, + AA_SFS_TYPE_INTPTR, AA_SFS_TYPE_FOPS, AA_SFS_TYPE_DIR, }; @@ -33,6 +34,7 @@ struct aa_sfs_entry { char *string; unsigned long u64; struct aa_sfs_entry *files; + int *intptr; } v; const struct file_operations *file_ops; }; @@ -51,6 +53,10 @@ extern const struct file_operations aa_sfs_seq_file_ops; { .name = (_name), .mode = 0444, \ .v_type = AA_SFS_TYPE_U64, .v.u64 = (_value), \ .file_ops = &aa_sfs_seq_file_ops } +#define AA_SFS_FILE_INTPTR(_name, _value) \ + { .name = (_name), .mode = 0444, \ + .v_type = AA_SFS_TYPE_INTPTR, .v.intptr = &(_value), \ + .file_ops = &aa_sfs_seq_file_ops } #define AA_SFS_FILE_FOPS(_name, _mode, _fops) \ { .name = (_name), .v_type = AA_SFS_TYPE_FOPS, \ .mode = (_mode), .file_ops = (_fops) }