diff options
Diffstat (limited to 'security/integrity')
-rw-r--r-- | security/integrity/ima/ima_fs.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/security/integrity/ima/ima_fs.c b/security/integrity/ima/ima_fs.c index 95ef1caa64b5..573780c76f1f 100644 --- a/security/integrity/ima/ima_fs.c +++ b/security/integrity/ima/ima_fs.c | |||
@@ -277,16 +277,30 @@ static struct dentry *runtime_measurements_count; | |||
277 | static struct dentry *violations; | 277 | static struct dentry *violations; |
278 | static struct dentry *ima_policy; | 278 | static struct dentry *ima_policy; |
279 | 279 | ||
280 | static atomic_t policy_opencount = ATOMIC_INIT(1); | ||
281 | /* | ||
282 | * ima_open_policy: sequentialize access to the policy file | ||
283 | */ | ||
284 | int ima_open_policy(struct inode * inode, struct file * filp) | ||
285 | { | ||
286 | if (atomic_dec_and_test(&policy_opencount)) | ||
287 | return 0; | ||
288 | return -EBUSY; | ||
289 | } | ||
290 | |||
280 | /* | 291 | /* |
281 | * ima_release_policy - start using the new measure policy rules. | 292 | * ima_release_policy - start using the new measure policy rules. |
282 | * | 293 | * |
283 | * Initially, ima_measure points to the default policy rules, now | 294 | * Initially, ima_measure points to the default policy rules, now |
284 | * point to the new policy rules, and remove the securityfs policy file. | 295 | * point to the new policy rules, and remove the securityfs policy file, |
296 | * assuming a valid policy. | ||
285 | */ | 297 | */ |
286 | static int ima_release_policy(struct inode *inode, struct file *file) | 298 | static int ima_release_policy(struct inode *inode, struct file *file) |
287 | { | 299 | { |
288 | if (!valid_policy) { | 300 | if (!valid_policy) { |
289 | ima_delete_rules(); | 301 | ima_delete_rules(); |
302 | valid_policy = 1; | ||
303 | atomic_set(&policy_opencount, 1); | ||
290 | return 0; | 304 | return 0; |
291 | } | 305 | } |
292 | ima_update_policy(); | 306 | ima_update_policy(); |
@@ -296,6 +310,7 @@ static int ima_release_policy(struct inode *inode, struct file *file) | |||
296 | } | 310 | } |
297 | 311 | ||
298 | static struct file_operations ima_measure_policy_ops = { | 312 | static struct file_operations ima_measure_policy_ops = { |
313 | .open = ima_open_policy, | ||
299 | .write = ima_write_policy, | 314 | .write = ima_write_policy, |
300 | .release = ima_release_policy | 315 | .release = ima_release_policy |
301 | }; | 316 | }; |