Hi Frederick,

On September 24, 2026 10:34:58 PM GMT+02:00, Frederick Lawler 
<[email protected]> wrote:
>integrity_audit_msg() hides error codes by wrapping
>integrity_audit_message() which obfuscates the underlying reason for the
>failure.
>
>Update integrity_audit_msg() to take a errno argument, and pass that
>through to integrity_audit_message(). Then update call sites to
>take caller's respective error codes.
>
>ima_appraise_measurement() stores xattr_len as the return code, but
>can replace it with a error code later. Therefore conditionally use
>a code if rc < 0, otherwise report zero. Lastly, conditionally use
>-EINVAL for ima_release_policy().
>
>Signed-off-by: Frederick Lawler <[email protected]>

Reviewed-by: Enrico Bravi <[email protected]>

Regards,

Enrico

>---
> security/integrity/evm/evm_main.c         |  9 +++++----
> security/integrity/ima/ima_api.c          |  8 ++++----
> security/integrity/ima/ima_appraise.c     |  6 +++---
> security/integrity/ima/ima_fs.c           |  7 ++++---
> security/integrity/ima/ima_init.c         |  2 +-
> security/integrity/ima/ima_main.c         |  7 ++++---
> security/integrity/ima/ima_policy.c       | 11 ++++++-----
> security/integrity/ima/ima_queue.c        |  2 +-
> security/integrity/ima/ima_template_lib.c |  2 +-
> security/integrity/integrity.h            |  5 +++--
> security/integrity/integrity_audit.c      |  5 +++--
> 11 files changed, 35 insertions(+), 29 deletions(-)
>
>diff --git a/security/integrity/evm/evm_main.c 
>b/security/integrity/evm/evm_main.c
>index 
>b59e3f121b8a89edb14d811351ec393a69de8ff7..5be9349afcd09b47b78d1126ffc1fe341264ae6e
> 100644
>--- a/security/integrity/evm/evm_main.c
>+++ b/security/integrity/evm/evm_main.c
>@@ -563,7 +563,7 @@ static int evm_protect_xattr(struct mnt_idmap *idmap,
>                                   dentry->d_inode, dentry->d_name.name,
>                                   "update_metadata",
>                                   integrity_status_msg[evm_status],
>-                                  -EPERM, 0);
>+                                  -EPERM, 0, -EPERM);
>       }
> out:
>       /* Exception if the HMAC is not going to be calculated. */
>@@ -588,7 +588,7 @@ static int evm_protect_xattr(struct mnt_idmap *idmap,
>               integrity_audit_msg(AUDIT_INTEGRITY_METADATA, 
> d_backing_inode(dentry),
>                                   dentry->d_name.name, "appraise_metadata",
>                                   integrity_status_msg[evm_status],
>-                                  -EPERM, 0);
>+                                  -EPERM, 0, -EPERM);
>       return evm_status == INTEGRITY_PASS ? 0 : -EPERM;
> }
> 
>@@ -729,7 +729,7 @@ static int evm_inode_set_acl(struct mnt_idmap *idmap, 
>struct dentry *dentry,
>               integrity_audit_msg(AUDIT_INTEGRITY_METADATA, 
> d_backing_inode(dentry),
>                                   dentry->d_name.name, "appraise_metadata",
>                                   integrity_status_msg[evm_status],
>-                                  -EPERM, 0);
>+                                  -EPERM, 0, -EPERM);
>       return -EPERM;
> }
> 
>@@ -992,7 +992,8 @@ static int evm_inode_setattr(struct mnt_idmap *idmap, 
>struct dentry *dentry,
> 
>       integrity_audit_msg(AUDIT_INTEGRITY_METADATA, d_backing_inode(dentry),
>                           dentry->d_name.name, "appraise_metadata",
>-                          integrity_status_msg[evm_status], -EPERM, 0);
>+                          integrity_status_msg[evm_status], -EPERM, 0,
>+                          -EPERM);
>       return -EPERM;
> }
> 
>diff --git a/security/integrity/ima/ima_api.c 
>b/security/integrity/ima/ima_api.c
>index 
>122d127e108dcca8ddae6575c908144859783fb6..f765bfe5db68d0847cfe5b47f81b64018083f65a
> 100644
>--- a/security/integrity/ima/ima_api.c
>+++ b/security/integrity/ima/ima_api.c
>@@ -116,7 +116,7 @@ int ima_store_template(struct ima_template_entry *entry,
>               if (result < 0) {
>                       integrity_audit_msg(AUDIT_INTEGRITY_PCR, inode,
>                                           template_name, op,
>-                                          audit_cause, result, 0);
>+                                          audit_cause, result, 0, result);
>                       return result;
>               }
>       }
>@@ -159,7 +159,7 @@ void ima_add_violation(struct file *file, const unsigned 
>char *filename,
>               ima_free_template_entry(entry);
> err_out:
>       integrity_audit_msg(AUDIT_INTEGRITY_PCR, inode, filename,
>-                          op, cause, result, 0);
>+                          op, cause, result, 0, result);
> }
> 
> /**
>@@ -330,7 +330,7 @@ int ima_collect_measurement(struct ima_iint_cache *iint, 
>struct file *file,
> 
>               integrity_audit_msg(AUDIT_INTEGRITY_DATA, inode,
>                                   filename.name.name, "collect_data",
>-                                  audit_cause, result, 0);
>+                                  audit_cause, result, 0, result);
> 
>               release_dentry_name_snapshot(&filename);
>       }
>@@ -383,7 +383,7 @@ void ima_store_measurement(struct ima_iint_cache *iint, 
>struct file *file,
>       result = ima_alloc_init_template(&event_data, &entry, template_desc);
>       if (result < 0) {
>               integrity_audit_msg(AUDIT_INTEGRITY_PCR, inode, filename,
>-                                  op, audit_cause, result, 0);
>+                                  op, audit_cause, result, 0, result);
>               return;
>       }
> 
>diff --git a/security/integrity/ima/ima_appraise.c 
>b/security/integrity/ima/ima_appraise.c
>index 
>b280488e15fcb0b6f8a8a0caaab93c7d511e4a40..84c4dee2323cf7352cccd8e4c9291d0fb6eed8e1
> 100644
>--- a/security/integrity/ima/ima_appraise.c
>+++ b/security/integrity/ima/ima_appraise.c
>@@ -564,7 +564,7 @@ int ima_appraise_measurement(enum ima_hooks func, struct 
>ima_iint_cache *iint,
>               status = INTEGRITY_FAIL;
>               cause = "unverifiable-signature";
>               integrity_audit_msg(audit_msgno, inode, filename,
>-                                  op, cause, rc, 0);
>+                                  op, cause, rc, 0, rc < 0 ? rc : 0);
>       } else if (status != INTEGRITY_PASS) {
>               /* Fix mode, but don't replace file signatures. */
>               if ((ima_appraise & IMA_APPRAISE_FIX) && !try_modsig &&
>@@ -589,7 +589,7 @@ int ima_appraise_measurement(enum ima_hooks func, struct 
>ima_iint_cache *iint,
>               }
> 
>               integrity_audit_msg(audit_msgno, inode, filename,
>-                                  op, cause, rc, 0);
>+                                  op, cause, rc, 0, rc < 0 ? rc : 0);
>       } else {
>               ima_cache_flags(iint, func);
>       }
>@@ -752,7 +752,7 @@ static int validate_hash_algo(struct dentry *dentry,
>               path = NULL;
> 
>       integrity_audit_msg(AUDIT_INTEGRITY_DATA, d_inode(dentry), path,
>-                          "set_data", errmsg, -EACCES, 0);
>+                          "set_data", errmsg, -EACCES, 0, -EACCES);
> 
>       kfree(pathbuf);
> 
>diff --git a/security/integrity/ima/ima_fs.c b/security/integrity/ima/ima_fs.c
>index 
>2a0bca5543161912abe2a0236c9fcae7055e62bc..3b8174a91a3451128c0b182e852875d5b73d3efb
> 100644
>--- a/security/integrity/ima/ima_fs.c
>+++ b/security/integrity/ima/ima_fs.c
>@@ -592,11 +592,11 @@ static ssize_t ima_write_policy(struct file *file, const 
>char __user *buf,
>       if (data[0] == '/') {
>               result = ima_read_policy(data);
>       } else if (ima_appraise & IMA_APPRAISE_POLICY) {
>+              result = -EACCES;
>               pr_err("signed policy file (specified as an absolute pathname) 
> required\n");
>               integrity_audit_msg(AUDIT_INTEGRITY_STATUS, NULL, NULL,
>                                   "policy_update", "signed policy required",
>-                                  1, 0);
>-              result = -EACCES;
>+                                  result, 0, result);
>       } else {
>               ima_measure_raw_policy(data, datalen);
>               result = ima_parse_add_rule(data);
>@@ -745,7 +745,8 @@ static int ima_release_policy(struct inode *inode, struct 
>file *file)
> 
>       pr_info("policy update %s\n", cause);
>       integrity_audit_msg(AUDIT_INTEGRITY_STATUS, NULL, NULL,
>-                          "policy_update", cause, !valid_policy, 0);
>+                          "policy_update", cause, !valid_policy, 0,
>+                          !valid_policy ? -EINVAL : 0);
> 
>       if (!valid_policy) {
>               ima_delete_rules();
>diff --git a/security/integrity/ima/ima_init.c 
>b/security/integrity/ima/ima_init.c
>index 
>d53f4d89a53e56d7ebb31950c10b37fc89782753..7a76e2686267482b10bf854a76829c60ef9f1e1b
> 100644
>--- a/security/integrity/ima/ima_init.c
>+++ b/security/integrity/ima/ima_init.c
>@@ -103,7 +103,7 @@ static int __init ima_add_boot_aggregate(void)
>       return 0;
> err_out:
>       integrity_audit_msg(AUDIT_INTEGRITY_PCR, NULL, filename, op,
>-                          audit_cause, result, 0);
>+                          audit_cause, result, 0, result);
>       return result;
> }
> 
>diff --git a/security/integrity/ima/ima_main.c 
>b/security/integrity/ima/ima_main.c
>index 
>ab1e53b3210d3a4d3f91d65f7db19e6a2a2d401c..9e80f40680d7be08d14d26ba48ed334d4e4ab10c
> 100644
>--- a/security/integrity/ima/ima_main.c
>+++ b/security/integrity/ima/ima_main.c
>@@ -119,7 +119,7 @@ static int mmap_violation_check(enum ima_hooks func, 
>struct file *file,
>                       *pathname = ima_d_path(&file->f_path, pathbuf,
>                                              filename);
>               integrity_audit_msg(AUDIT_INTEGRITY_DATA, inode, *pathname,
>-                                  "mmap_file", "mmapped_writers", rc, 0);
>+                                  "mmap_file", "mmapped_writers", rc, 0, rc);
>       }
>       return rc;
> }
>@@ -466,7 +466,7 @@ static int process_measurement(struct file *file, const 
>struct cred *cred,
> 
>               integrity_audit_msg(AUDIT_INTEGRITY_DATA, file_inode(file),
>                                   pathname, "collect_data",
>-                                  "denied-hash-algorithm", rc, 0);
>+                                  "denied-hash-algorithm", rc, 0, rc);
>       }
> out_locked:
>       if ((mask & MAY_WRITE) && test_bit(IMA_DIGSIG, &iint->atomic_flags) &&
>@@ -579,7 +579,8 @@ static int ima_file_mprotect(struct vm_area_struct *vma, 
>unsigned long reqprot,
>       file = vma->vm_file;
>       pathname = ima_d_path(&file->f_path, &pathbuf, filename);
>       integrity_audit_msg(AUDIT_INTEGRITY_DATA, inode, pathname,
>-                          "collect_data", "failed-mprotect", result, 0);
>+                          "collect_data", "failed-mprotect", result, 0,
>+                          result);
>       if (pathbuf)
>               __putname(pathbuf);
> 
>diff --git a/security/integrity/ima/ima_policy.c 
>b/security/integrity/ima/ima_policy.c
>index 
>68d9a5e6c232ea0678e9f51f105cebecccccb43e..9013c962dc0bfd6184948230ad6746e71f6e82f5
> 100644
>--- a/security/integrity/ima/ima_policy.c
>+++ b/security/integrity/ima/ima_policy.c
>@@ -1992,7 +1992,8 @@ ssize_t ima_parse_add_rule(char *rule)
>       entry = kzalloc_obj(*entry);
>       if (!entry) {
>               integrity_audit_msg(AUDIT_INTEGRITY_STATUS, NULL,
>-                                  NULL, op, "-ENOMEM", -ENOMEM, audit_info);
>+                                  NULL, op, "-ENOMEM", -ENOMEM, audit_info,
>+                                  -ENOMEM);
>               return -ENOMEM;
>       }
> 
>@@ -2003,7 +2004,7 @@ ssize_t ima_parse_add_rule(char *rule)
>               ima_free_rule(entry);
>               integrity_audit_msg(AUDIT_INTEGRITY_STATUS, NULL,
>                                   NULL, op, "invalid-policy", result,
>-                                  audit_info);
>+                                  audit_info, result);
>               return result;
>       }
> 
>@@ -2421,7 +2422,7 @@ void ima_measure_loaded_policy(void)
>       rule = kmalloc(rule_len, GFP_KERNEL);
>       if (!rule) {
>               integrity_audit_msg(AUDIT_INTEGRITY_PCR, NULL, event_name,
>-                                  op, "ENOMEM", result, 0);
>+                                  op, "ENOMEM", result, 0, result);
>               return;
>       }
> 
>@@ -2440,7 +2441,7 @@ void ima_measure_loaded_policy(void)
>                       result = -E2BIG;
>                       integrity_audit_msg(AUDIT_INTEGRITY_PCR, NULL,
>                                           event_name, op, "rule_length",
>-                                          result, 0);
>+                                          result, 0, result);
>                       rcu_read_unlock();
>                       goto free_rule;
>               }
>@@ -2454,7 +2455,7 @@ void ima_measure_loaded_policy(void)
>       file.buf = kmalloc(file_len, GFP_KERNEL);
>       if (!file.buf) {
>               integrity_audit_msg(AUDIT_INTEGRITY_PCR, NULL, event_name,
>-                                  op, "ENOMEM", result, 0);
>+                                  op, "ENOMEM", result, 0, result);
>               goto free_rule;
>       }
> 
>diff --git a/security/integrity/ima/ima_queue.c 
>b/security/integrity/ima/ima_queue.c
>index 
>f89f0ca3d4edf16a7147b3c23d25fc2cf18044c6..8d3282ff7da4131ae4389bf832442285e500542d
> 100644
>--- a/security/integrity/ima/ima_queue.c
>+++ b/security/integrity/ima/ima_queue.c
>@@ -292,7 +292,7 @@ int ima_add_template_entry(struct ima_template_entry 
>*entry, int violation,
> out:
>       mutex_unlock(&ima_extend_list_mutex);
>       integrity_audit_msg(AUDIT_INTEGRITY_PCR, inode, filename,
>-                          op, audit_cause, result, audit_info);
>+                          op, audit_cause, result, audit_info, result);
>       return result;
> }
> 
>diff --git a/security/integrity/ima/ima_template_lib.c 
>b/security/integrity/ima/ima_template_lib.c
>index 
>8a89236f926c10af0dd2b2ef08fbe59bd8a78b66..9bd80ca1159a2fe24b3ea3308a118f6beea733cb
> 100644
>--- a/security/integrity/ima/ima_template_lib.c
>+++ b/security/integrity/ima/ima_template_lib.c
>@@ -392,7 +392,7 @@ int ima_eventdigest_init(struct ima_event_data *event_data,
>       if (result) {
>               integrity_audit_msg(AUDIT_INTEGRITY_DATA, inode,
>                                   event_data->filename, "collect_data",
>-                                  "failed", result, 0);
>+                                  "failed", result, 0, result);
>               return result;
>       }
>       cur_digest = hash_hdr->digest;
>diff --git a/security/integrity/integrity.h b/security/integrity/integrity.h
>index 
>0c581c03c5da72d80e9c352a7adff1fb89628644..2ab6b7e34e7ee2dd29ae03ae1fb45fa26d9c032a
> 100644
>--- a/security/integrity/integrity.h
>+++ b/security/integrity/integrity.h
>@@ -218,7 +218,8 @@ static inline void evm_load_x509(void)
> /* declarations */
> void integrity_audit_msg(int audit_msgno, struct inode *inode,
>                        const unsigned char *fname, const char *op,
>-                       const char *cause, int result, int info);
>+                       const char *cause, int result, int info,
>+                       int errno);
> 
> void integrity_audit_message(int audit_msgno, struct inode *inode,
>                            const unsigned char *fname, const char *op,
>@@ -235,7 +236,7 @@ integrity_audit_log_start(struct audit_context *ctx, gfp_t 
>gfp_mask, int type)
> static inline void integrity_audit_msg(int audit_msgno, struct inode *inode,
>                                      const unsigned char *fname,
>                                      const char *op, const char *cause,
>-                                     int result, int info)
>+                                     int result, int info, int errno)
> {
> }
> 
>diff --git a/security/integrity/integrity_audit.c 
>b/security/integrity/integrity_audit.c
>index 
>d8d9e5ff1cd22b091f462d1e83d28d2d6bd983e9..2dd2d7e3916e7bf35c753450315ff22e2d0292b7
> 100644
>--- a/security/integrity/integrity_audit.c
>+++ b/security/integrity/integrity_audit.c
>@@ -27,10 +27,11 @@ __setup("integrity_audit=", integrity_audit_setup);
> 
> void integrity_audit_msg(int audit_msgno, struct inode *inode,
>                        const unsigned char *fname, const char *op,
>-                       const char *cause, int result, int audit_info)
>+                       const char *cause, int result, int audit_info,
>+                       int errno)
> {
>       integrity_audit_message(audit_msgno, inode, fname, op, cause,
>-                              result, audit_info, 0);
>+                              result, audit_info, errno);
> }
> 
> void integrity_audit_message(int audit_msgno, struct inode *inode,
>

Reply via email to