提交 d6a13c17 编写于 作者: M Michael Halcrow 提交者: Linus Torvalds

eCryptfs: fix data types

Update data types and add casts in order to avoid potential overflow
issues.
Signed-off-by: NMichael Halcrow <mhalcrow@us.ibm.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 bf12be1c
...@@ -149,7 +149,7 @@ static int ecryptfs_crypto_api_algify_cipher_name(char **algified_name, ...@@ -149,7 +149,7 @@ static int ecryptfs_crypto_api_algify_cipher_name(char **algified_name,
* ecryptfs_derive_iv * ecryptfs_derive_iv
* @iv: destination for the derived iv vale * @iv: destination for the derived iv vale
* @crypt_stat: Pointer to crypt_stat struct for the current inode * @crypt_stat: Pointer to crypt_stat struct for the current inode
* @offset: Offset of the page whose's iv we are to derive * @offset: Offset of the extent whose IV we are to derive
* *
* Generate the initialization vector from the given root IV and page * Generate the initialization vector from the given root IV and page
* offset. * offset.
...@@ -157,7 +157,7 @@ static int ecryptfs_crypto_api_algify_cipher_name(char **algified_name, ...@@ -157,7 +157,7 @@ static int ecryptfs_crypto_api_algify_cipher_name(char **algified_name,
* Returns zero on success; non-zero on error. * Returns zero on success; non-zero on error.
*/ */
static int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat, static int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat,
pgoff_t offset) loff_t offset)
{ {
int rc = 0; int rc = 0;
char dst[MD5_DIGEST_SIZE]; char dst[MD5_DIGEST_SIZE];
...@@ -173,7 +173,7 @@ static int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat, ...@@ -173,7 +173,7 @@ static int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat,
* hashing business. -Halcrow */ * hashing business. -Halcrow */
memcpy(src, crypt_stat->root_iv, crypt_stat->iv_bytes); memcpy(src, crypt_stat->root_iv, crypt_stat->iv_bytes);
memset((src + crypt_stat->iv_bytes), 0, 16); memset((src + crypt_stat->iv_bytes), 0, 16);
snprintf((src + crypt_stat->iv_bytes), 16, "%ld", offset); snprintf((src + crypt_stat->iv_bytes), 16, "%lld", offset);
if (unlikely(ecryptfs_verbosity > 0)) { if (unlikely(ecryptfs_verbosity > 0)) {
ecryptfs_printk(KERN_DEBUG, "source:\n"); ecryptfs_printk(KERN_DEBUG, "source:\n");
ecryptfs_dump_hex(src, (crypt_stat->iv_bytes + 16)); ecryptfs_dump_hex(src, (crypt_stat->iv_bytes + 16));
...@@ -497,11 +497,11 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page, ...@@ -497,11 +497,11 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page,
struct page *page, struct page *page,
unsigned long extent_offset) unsigned long extent_offset)
{ {
unsigned long extent_base; loff_t extent_base;
char extent_iv[ECRYPTFS_MAX_IV_BYTES]; char extent_iv[ECRYPTFS_MAX_IV_BYTES];
int rc; int rc;
extent_base = (page->index extent_base = (((loff_t)page->index)
* (PAGE_CACHE_SIZE / crypt_stat->extent_size)); * (PAGE_CACHE_SIZE / crypt_stat->extent_size));
rc = ecryptfs_derive_iv(extent_iv, crypt_stat, rc = ecryptfs_derive_iv(extent_iv, crypt_stat,
(extent_base + extent_offset)); (extent_base + extent_offset));
...@@ -605,7 +605,8 @@ int ecryptfs_encrypt_page(struct page *page) ...@@ -605,7 +605,8 @@ int ecryptfs_encrypt_page(struct page *page)
goto out; goto out;
} }
ecryptfs_lower_offset_for_extent( ecryptfs_lower_offset_for_extent(
&offset, ((page->index * (PAGE_CACHE_SIZE &offset, ((((loff_t)page->index)
* (PAGE_CACHE_SIZE
/ crypt_stat->extent_size)) / crypt_stat->extent_size))
+ extent_offset), crypt_stat); + extent_offset), crypt_stat);
rc = ecryptfs_write_lower(ecryptfs_inode, enc_extent_virt, rc = ecryptfs_write_lower(ecryptfs_inode, enc_extent_virt,
...@@ -628,11 +629,11 @@ static int ecryptfs_decrypt_extent(struct page *page, ...@@ -628,11 +629,11 @@ static int ecryptfs_decrypt_extent(struct page *page,
struct page *enc_extent_page, struct page *enc_extent_page,
unsigned long extent_offset) unsigned long extent_offset)
{ {
unsigned long extent_base; loff_t extent_base;
char extent_iv[ECRYPTFS_MAX_IV_BYTES]; char extent_iv[ECRYPTFS_MAX_IV_BYTES];
int rc; int rc;
extent_base = (page->index extent_base = (((loff_t)page->index)
* (PAGE_CACHE_SIZE / crypt_stat->extent_size)); * (PAGE_CACHE_SIZE / crypt_stat->extent_size));
rc = ecryptfs_derive_iv(extent_iv, crypt_stat, rc = ecryptfs_derive_iv(extent_iv, crypt_stat,
(extent_base + extent_offset)); (extent_base + extent_offset));
...@@ -1471,7 +1472,7 @@ ecryptfs_write_metadata_to_contents(struct ecryptfs_crypt_stat *crypt_stat, ...@@ -1471,7 +1472,7 @@ ecryptfs_write_metadata_to_contents(struct ecryptfs_crypt_stat *crypt_stat,
while (current_header_page < header_pages) { while (current_header_page < header_pages) {
loff_t offset; loff_t offset;
offset = (current_header_page << PAGE_CACHE_SHIFT); offset = (((loff_t)current_header_page) << PAGE_CACHE_SHIFT);
if ((rc = ecryptfs_write_lower(ecryptfs_dentry->d_inode, if ((rc = ecryptfs_write_lower(ecryptfs_dentry->d_inode,
page_virt, offset, page_virt, offset,
PAGE_CACHE_SIZE))) { PAGE_CACHE_SIZE))) {
......
...@@ -286,7 +286,8 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, ...@@ -286,7 +286,8 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page,
int rc = 0; int rc = 0;
while (extent_num_in_page < num_extents_per_page) { while (extent_num_in_page < num_extents_per_page) {
loff_t view_extent_num = ((page->index * num_extents_per_page) loff_t view_extent_num = ((((loff_t)page->index)
* num_extents_per_page)
+ extent_num_in_page); + extent_num_in_page);
if (view_extent_num < crypt_stat->num_header_extents_at_front) { if (view_extent_num < crypt_stat->num_header_extents_at_front) {
...@@ -706,7 +707,7 @@ static int ecryptfs_commit_write(struct file *file, struct page *page, ...@@ -706,7 +707,7 @@ static int ecryptfs_commit_write(struct file *file, struct page *page,
"index [0x%.16x])\n", page->index); "index [0x%.16x])\n", page->index);
goto out; goto out;
} }
pos = (page->index << PAGE_CACHE_SHIFT) + to; pos = (((loff_t)page->index) << PAGE_CACHE_SHIFT) + to;
if (pos > i_size_read(ecryptfs_inode)) { if (pos > i_size_read(ecryptfs_inode)) {
i_size_write(ecryptfs_inode, pos); i_size_write(ecryptfs_inode, pos);
ecryptfs_printk(KERN_DEBUG, "Expanded file size to " ecryptfs_printk(KERN_DEBUG, "Expanded file size to "
......
...@@ -87,7 +87,8 @@ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, ...@@ -87,7 +87,8 @@ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode,
loff_t offset; loff_t offset;
int rc; int rc;
offset = (page_for_lower->index << PAGE_CACHE_SHIFT) + offset_in_page; offset = ((((off_t)page_for_lower->index) << PAGE_CACHE_SHIFT)
+ offset_in_page);
virt = kmap(page_for_lower); virt = kmap(page_for_lower);
rc = ecryptfs_write_lower(ecryptfs_inode, virt, offset, size); rc = ecryptfs_write_lower(ecryptfs_inode, virt, offset, size);
kunmap(page_for_lower); kunmap(page_for_lower);
...@@ -117,7 +118,8 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, ...@@ -117,7 +118,8 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset,
{ {
struct page *ecryptfs_page; struct page *ecryptfs_page;
char *ecryptfs_page_virt; char *ecryptfs_page_virt;
u64 ecryptfs_file_size = i_size_read(ecryptfs_file->f_dentry->d_inode); loff_t ecryptfs_file_size =
i_size_read(ecryptfs_file->f_dentry->d_inode);
loff_t data_offset = 0; loff_t data_offset = 0;
loff_t pos; loff_t pos;
int rc = 0; int rc = 0;
...@@ -277,7 +279,7 @@ int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, ...@@ -277,7 +279,7 @@ int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs,
loff_t offset; loff_t offset;
int rc; int rc;
offset = ((page_index << PAGE_CACHE_SHIFT) + offset_in_page); offset = ((((loff_t)page_index) << PAGE_CACHE_SHIFT) + offset_in_page);
virt = kmap(page_for_ecryptfs); virt = kmap(page_for_ecryptfs);
rc = ecryptfs_read_lower(virt, offset, size, ecryptfs_inode); rc = ecryptfs_read_lower(virt, offset, size, ecryptfs_inode);
kunmap(page_for_ecryptfs); kunmap(page_for_ecryptfs);
...@@ -306,7 +308,8 @@ int ecryptfs_read(char *data, loff_t offset, size_t size, ...@@ -306,7 +308,8 @@ int ecryptfs_read(char *data, loff_t offset, size_t size,
{ {
struct page *ecryptfs_page; struct page *ecryptfs_page;
char *ecryptfs_page_virt; char *ecryptfs_page_virt;
u64 ecryptfs_file_size = i_size_read(ecryptfs_file->f_dentry->d_inode); loff_t ecryptfs_file_size =
i_size_read(ecryptfs_file->f_dentry->d_inode);
loff_t data_offset = 0; loff_t data_offset = 0;
loff_t pos; loff_t pos;
int rc = 0; int rc = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册