aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ecryptfs/crypto.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ecryptfs/crypto.c')
-rw-r--r--fs/ecryptfs/crypto.c67
1 files changed, 32 insertions, 35 deletions
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index e2832bc7869a..06db79d05c12 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -33,6 +33,7 @@
33#include <linux/crypto.h> 33#include <linux/crypto.h>
34#include <linux/file.h> 34#include <linux/file.h>
35#include <linux/scatterlist.h> 35#include <linux/scatterlist.h>
36#include <asm/unaligned.h>
36#include "ecryptfs_kernel.h" 37#include "ecryptfs_kernel.h"
37 38
38static int 39static int
@@ -474,8 +475,8 @@ int ecryptfs_encrypt_page(struct page *page)
474{ 475{
475 struct inode *ecryptfs_inode; 476 struct inode *ecryptfs_inode;
476 struct ecryptfs_crypt_stat *crypt_stat; 477 struct ecryptfs_crypt_stat *crypt_stat;
477 char *enc_extent_virt = NULL; 478 char *enc_extent_virt;
478 struct page *enc_extent_page; 479 struct page *enc_extent_page = NULL;
479 loff_t extent_offset; 480 loff_t extent_offset;
480 int rc = 0; 481 int rc = 0;
481 482
@@ -491,14 +492,14 @@ int ecryptfs_encrypt_page(struct page *page)
491 page->index); 492 page->index);
492 goto out; 493 goto out;
493 } 494 }
494 enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER); 495 enc_extent_page = alloc_page(GFP_USER);
495 if (!enc_extent_virt) { 496 if (!enc_extent_page) {
496 rc = -ENOMEM; 497 rc = -ENOMEM;
497 ecryptfs_printk(KERN_ERR, "Error allocating memory for " 498 ecryptfs_printk(KERN_ERR, "Error allocating memory for "
498 "encrypted extent\n"); 499 "encrypted extent\n");
499 goto out; 500 goto out;
500 } 501 }
501 enc_extent_page = virt_to_page(enc_extent_virt); 502 enc_extent_virt = kmap(enc_extent_page);
502 for (extent_offset = 0; 503 for (extent_offset = 0;
503 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size); 504 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
504 extent_offset++) { 505 extent_offset++) {
@@ -526,7 +527,10 @@ int ecryptfs_encrypt_page(struct page *page)
526 } 527 }
527 } 528 }
528out: 529out:
529 kfree(enc_extent_virt); 530 if (enc_extent_page) {
531 kunmap(enc_extent_page);
532 __free_page(enc_extent_page);
533 }
530 return rc; 534 return rc;
531} 535}
532 536
@@ -608,8 +612,8 @@ int ecryptfs_decrypt_page(struct page *page)
608{ 612{
609 struct inode *ecryptfs_inode; 613 struct inode *ecryptfs_inode;
610 struct ecryptfs_crypt_stat *crypt_stat; 614 struct ecryptfs_crypt_stat *crypt_stat;
611 char *enc_extent_virt = NULL; 615 char *enc_extent_virt;
612 struct page *enc_extent_page; 616 struct page *enc_extent_page = NULL;
613 unsigned long extent_offset; 617 unsigned long extent_offset;
614 int rc = 0; 618 int rc = 0;
615 619
@@ -626,14 +630,14 @@ int ecryptfs_decrypt_page(struct page *page)
626 page->index); 630 page->index);
627 goto out; 631 goto out;
628 } 632 }
629 enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER); 633 enc_extent_page = alloc_page(GFP_USER);
630 if (!enc_extent_virt) { 634 if (!enc_extent_page) {
631 rc = -ENOMEM; 635 rc = -ENOMEM;
632 ecryptfs_printk(KERN_ERR, "Error allocating memory for " 636 ecryptfs_printk(KERN_ERR, "Error allocating memory for "
633 "encrypted extent\n"); 637 "encrypted extent\n");
634 goto out; 638 goto out;
635 } 639 }
636 enc_extent_page = virt_to_page(enc_extent_virt); 640 enc_extent_virt = kmap(enc_extent_page);
637 for (extent_offset = 0; 641 for (extent_offset = 0;
638 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size); 642 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
639 extent_offset++) { 643 extent_offset++) {
@@ -661,7 +665,10 @@ int ecryptfs_decrypt_page(struct page *page)
661 } 665 }
662 } 666 }
663out: 667out:
664 kfree(enc_extent_virt); 668 if (enc_extent_page) {
669 kunmap(enc_extent_page);
670 __free_page(enc_extent_page);
671 }
665 return rc; 672 return rc;
666} 673}
667 674
@@ -1032,10 +1039,8 @@ static int contains_ecryptfs_marker(char *data)
1032{ 1039{
1033 u32 m_1, m_2; 1040 u32 m_1, m_2;
1034 1041
1035 memcpy(&m_1, data, 4); 1042 m_1 = get_unaligned_be32(data);
1036 m_1 = be32_to_cpu(m_1); 1043 m_2 = get_unaligned_be32(data + 4);
1037 memcpy(&m_2, (data + 4), 4);
1038 m_2 = be32_to_cpu(m_2);
1039 if ((m_1 ^ MAGIC_ECRYPTFS_MARKER) == m_2) 1044 if ((m_1 ^ MAGIC_ECRYPTFS_MARKER) == m_2)
1040 return 1; 1045 return 1;
1041 ecryptfs_printk(KERN_DEBUG, "m_1 = [0x%.8x]; m_2 = [0x%.8x]; " 1046 ecryptfs_printk(KERN_DEBUG, "m_1 = [0x%.8x]; m_2 = [0x%.8x]; "
@@ -1073,8 +1078,7 @@ static int ecryptfs_process_flags(struct ecryptfs_crypt_stat *crypt_stat,
1073 int i; 1078 int i;
1074 u32 flags; 1079 u32 flags;
1075 1080
1076 memcpy(&flags, page_virt, 4); 1081 flags = get_unaligned_be32(page_virt);
1077 flags = be32_to_cpu(flags);
1078 for (i = 0; i < ((sizeof(ecryptfs_flag_map) 1082 for (i = 0; i < ((sizeof(ecryptfs_flag_map)
1079 / sizeof(struct ecryptfs_flag_map_elem))); i++) 1083 / sizeof(struct ecryptfs_flag_map_elem))); i++)
1080 if (flags & ecryptfs_flag_map[i].file_flag) { 1084 if (flags & ecryptfs_flag_map[i].file_flag) {
@@ -1100,11 +1104,9 @@ static void write_ecryptfs_marker(char *page_virt, size_t *written)
1100 1104
1101 get_random_bytes(&m_1, (MAGIC_ECRYPTFS_MARKER_SIZE_BYTES / 2)); 1105 get_random_bytes(&m_1, (MAGIC_ECRYPTFS_MARKER_SIZE_BYTES / 2));
1102 m_2 = (m_1 ^ MAGIC_ECRYPTFS_MARKER); 1106 m_2 = (m_1 ^ MAGIC_ECRYPTFS_MARKER);
1103 m_1 = cpu_to_be32(m_1); 1107 put_unaligned_be32(m_1, page_virt);
1104 memcpy(page_virt, &m_1, (MAGIC_ECRYPTFS_MARKER_SIZE_BYTES / 2)); 1108 page_virt += (MAGIC_ECRYPTFS_MARKER_SIZE_BYTES / 2);
1105 m_2 = cpu_to_be32(m_2); 1109 put_unaligned_be32(m_2, page_virt);
1106 memcpy(page_virt + (MAGIC_ECRYPTFS_MARKER_SIZE_BYTES / 2), &m_2,
1107 (MAGIC_ECRYPTFS_MARKER_SIZE_BYTES / 2));
1108 (*written) = MAGIC_ECRYPTFS_MARKER_SIZE_BYTES; 1110 (*written) = MAGIC_ECRYPTFS_MARKER_SIZE_BYTES;
1109} 1111}
1110 1112
@@ -1121,8 +1123,7 @@ write_ecryptfs_flags(char *page_virt, struct ecryptfs_crypt_stat *crypt_stat,
1121 flags |= ecryptfs_flag_map[i].file_flag; 1123 flags |= ecryptfs_flag_map[i].file_flag;
1122 /* Version is in top 8 bits of the 32-bit flag vector */ 1124 /* Version is in top 8 bits of the 32-bit flag vector */
1123 flags |= ((((u8)crypt_stat->file_version) << 24) & 0xFF000000); 1125 flags |= ((((u8)crypt_stat->file_version) << 24) & 0xFF000000);
1124 flags = cpu_to_be32(flags); 1126 put_unaligned_be32(flags, page_virt);
1125 memcpy(page_virt, &flags, 4);
1126 (*written) = 4; 1127 (*written) = 4;
1127} 1128}
1128 1129
@@ -1238,11 +1239,9 @@ ecryptfs_write_header_metadata(char *virt,
1238 num_header_extents_at_front = 1239 num_header_extents_at_front =
1239 (u16)(crypt_stat->num_header_bytes_at_front 1240 (u16)(crypt_stat->num_header_bytes_at_front
1240 / crypt_stat->extent_size); 1241 / crypt_stat->extent_size);
1241 header_extent_size = cpu_to_be32(header_extent_size); 1242 put_unaligned_be32(header_extent_size, virt);
1242 memcpy(virt, &header_extent_size, 4);
1243 virt += 4; 1243 virt += 4;
1244 num_header_extents_at_front = cpu_to_be16(num_header_extents_at_front); 1244 put_unaligned_be16(num_header_extents_at_front, virt);
1245 memcpy(virt, &num_header_extents_at_front, 2);
1246 (*written) = 6; 1245 (*written) = 6;
1247} 1246}
1248 1247
@@ -1410,15 +1409,13 @@ static int parse_header_metadata(struct ecryptfs_crypt_stat *crypt_stat,
1410 u32 header_extent_size; 1409 u32 header_extent_size;
1411 u16 num_header_extents_at_front; 1410 u16 num_header_extents_at_front;
1412 1411
1413 memcpy(&header_extent_size, virt, sizeof(u32)); 1412 header_extent_size = get_unaligned_be32(virt);
1414 header_extent_size = be32_to_cpu(header_extent_size); 1413 virt += sizeof(__be32);
1415 virt += sizeof(u32); 1414 num_header_extents_at_front = get_unaligned_be16(virt);
1416 memcpy(&num_header_extents_at_front, virt, sizeof(u16));
1417 num_header_extents_at_front = be16_to_cpu(num_header_extents_at_front);
1418 crypt_stat->num_header_bytes_at_front = 1415 crypt_stat->num_header_bytes_at_front =
1419 (((size_t)num_header_extents_at_front 1416 (((size_t)num_header_extents_at_front
1420 * (size_t)header_extent_size)); 1417 * (size_t)header_extent_size));
1421 (*bytes_read) = (sizeof(u32) + sizeof(u16)); 1418 (*bytes_read) = (sizeof(__be32) + sizeof(__be16));
1422 if ((validate_header_size == ECRYPTFS_VALIDATE_HEADER_SIZE) 1419 if ((validate_header_size == ECRYPTFS_VALIDATE_HEADER_SIZE)
1423 && (crypt_stat->num_header_bytes_at_front 1420 && (crypt_stat->num_header_bytes_at_front
1424 < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE)) { 1421 < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE)) {