ima: integrity appraisal extension
[sfrench/cifs-2.6.git] / security / integrity / ima / ima_crypto.c
index 9b3ade7468b283412fa962fa291f0c3f6413812f..b21ee5b5495a8a4a3bf3e5626cd367d16158757f 100644 (file)
@@ -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;
-       int rc;
+       int rc, read = 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;
        }
+       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;
@@ -80,6 +84,8 @@ int ima_calc_hash(struct file *file, char *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;