diff options
Diffstat (limited to 'security/integrity/ima/ima_main.c')
| -rw-r--r-- | security/integrity/ima/ima_main.c | 50 | 
1 files changed, 38 insertions, 12 deletions
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index b17be79b9cf..be8294915cf 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -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; @@ -228,15 +258,11 @@ static int __init init_ima(void)  	int error;  	error = ima_init(); -	ima_initialized = 1; +	if (!error) +		ima_initialized = 1;  	return error;  } -static void __exit cleanup_ima(void) -{ -	ima_cleanup(); -} -  late_initcall(init_ima);	/* Start IMA after the TPM is available */  MODULE_DESCRIPTION("Integrity Measurement Architecture");  |