projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ima: integrity appraisal extension
[firefly-linux-kernel-4.4.55.git]
/
security
/
integrity
/
ima
/
ima_crypto.c
diff --git
a/security/integrity/ima/ima_crypto.c
b/security/integrity/ima/ima_crypto.c
index 9b3ade7468b283412fa962fa291f0c3f6413812f..b21ee5b5495a8a4a3bf3e5626cd367d16158757f 100644
(file)
--- a/
security/integrity/ima/ima_crypto.c
+++ b/
security/integrity/ima/ima_crypto.c
@@
-48,7
+48,7
@@
int ima_calc_hash(struct file *file, char *digest)
struct scatterlist sg[1];
loff_t i_size, offset = 0;
char *rbuf;
struct scatterlist sg[1];
loff_t i_size, offset = 0;
char *rbuf;
- int rc;
+ int rc
, read = 0
;
rc = init_desc(&desc);
if (rc != 0)
rc = init_desc(&desc);
if (rc != 0)
@@
-59,6
+59,10
@@
int ima_calc_hash(struct file *file, char *digest)
rc = -ENOMEM;
goto out;
}
rc = -ENOMEM;
goto out;
}
+ if (!(file->f_mode & FMODE_READ)) {
+ file->f_mode |= FMODE_READ;
+ read = 1;
+ }
i_size = i_size_read(file->f_dentry->d_inode);
while (offset < i_size) {
int rbuf_len;
i_size = i_size_read(file->f_dentry->d_inode);
while (offset < i_size) {
int rbuf_len;
@@
-80,6
+84,8
@@
int ima_calc_hash(struct file *file, char *digest)
kfree(rbuf);
if (!rc)
rc = crypto_hash_final(&desc, digest);
kfree(rbuf);
if (!rc)
rc = crypto_hash_final(&desc, digest);
+ if (read)
+ file->f_mode &= ~FMODE_READ;
out:
crypto_free_hash(desc.tfm);
return rc;
out:
crypto_free_hash(desc.tfm);
return rc;