diff options
Diffstat (limited to 'fs/ecryptfs/crypto.c')
| -rw-r--r-- | fs/ecryptfs/crypto.c | 67 |
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 | ||
| 38 | static int | 39 | static 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 | } |
| 528 | out: | 529 | out: |
| 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 | } |
| 663 | out: | 667 | out: |
| 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)) { |
