|
@@ -54,6 +54,7 @@ static void ima_rdwr_violation_check(struct file *file)
|
|
|
fmode_t mode = file->f_mode;
|
|
|
int rc;
|
|
|
bool send_tomtou = false, send_writers = false;
|
|
|
+ unsigned char *pathname = NULL, *pathbuf = NULL;
|
|
|
|
|
|
if (!S_ISREG(inode->i_mode) || !ima_initialized)
|
|
|
return;
|
|
@@ -75,12 +76,27 @@ static void ima_rdwr_violation_check(struct file *file)
|
|
|
out:
|
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
|
|
|
+ if (!send_tomtou && !send_writers)
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* We will allow 11 spaces for ' (deleted)' to be appended */
|
|
|
+ pathbuf = kmalloc(PATH_MAX + 11, GFP_KERNEL);
|
|
|
+ if (pathbuf) {
|
|
|
+ pathname = d_path(&file->f_path, pathbuf, PATH_MAX + 11);
|
|
|
+ if (IS_ERR(pathname))
|
|
|
+ pathname = NULL;
|
|
|
+ else if (strlen(pathname) > IMA_EVENT_NAME_LEN_MAX)
|
|
|
+ pathname = NULL;
|
|
|
+ }
|
|
|
if (send_tomtou)
|
|
|
- ima_add_violation(inode, dentry->d_name.name, "invalid_pcr",
|
|
|
- "ToMToU");
|
|
|
+ ima_add_violation(inode,
|
|
|
+ !pathname ? dentry->d_name.name : pathname,
|
|
|
+ "invalid_pcr", "ToMToU");
|
|
|
if (send_writers)
|
|
|
- ima_add_violation(inode, dentry->d_name.name, "invalid_pcr",
|
|
|
- "open_writers");
|
|
|
+ ima_add_violation(inode,
|
|
|
+ !pathname ? dentry->d_name.name : pathname,
|
|
|
+ "invalid_pcr", "open_writers");
|
|
|
+ kfree(pathbuf);
|
|
|
}
|
|
|
|
|
|
static void ima_check_last_writer(struct integrity_iint_cache *iint,
|
|
@@ -123,6 +139,7 @@ static int process_measurement(struct file *file, const unsigned char *filename,
|
|
|
{
|
|
|
struct inode *inode = file->f_dentry->d_inode;
|
|
|
struct integrity_iint_cache *iint;
|
|
|
+ unsigned char *pathname = NULL, *pathbuf = NULL;
|
|
|
int rc = 0;
|
|
|
|
|
|
if (!ima_initialized || !S_ISREG(inode->i_mode))
|
|
@@ -147,8 +164,21 @@ retry:
|
|
|
goto out;
|
|
|
|
|
|
rc = ima_collect_measurement(iint, file);
|
|
|
- if (!rc)
|
|
|
- ima_store_measurement(iint, file, filename);
|
|
|
+ if (rc != 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ if (function != BPRM_CHECK) {
|
|
|
+ /* We will allow 11 spaces for ' (deleted)' to be appended */
|
|
|
+ pathbuf = kmalloc(PATH_MAX + 11, GFP_KERNEL);
|
|
|
+ if (pathbuf) {
|
|
|
+ pathname =
|
|
|
+ d_path(&file->f_path, pathbuf, PATH_MAX + 11);
|
|
|
+ if (IS_ERR(pathname))
|
|
|
+ pathname = NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ima_store_measurement(iint, file, !pathname ? filename : pathname);
|
|
|
+ kfree(pathbuf);
|
|
|
out:
|
|
|
mutex_unlock(&iint->mutex);
|
|
|
return rc;
|