Commit 3bd1f4a1 authored by Anton Altaparmakov's avatar Anton Altaparmakov

NTFS: Fix several occurences of a bug where we would perform 'var & ~const'

      with a 64-bit variable and a int, i.e. 32-bit, constant.  This causes
      the higher order 32-bits of the 64-bit variable to be zeroed.  To fix
      this cast the 'const' to the same 64-bit type as 'var'.
Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent ca8fd7a0
...@@ -128,6 +128,10 @@ ToDo/Notes: ...@@ -128,6 +128,10 @@ ToDo/Notes:
- Detect the case when Windows has been suspended to disk on the volume - Detect the case when Windows has been suspended to disk on the volume
to be mounted and if this is the case do not allow (re)mounting to be mounted and if this is the case do not allow (re)mounting
read-write. This is done by parsing hiberfil.sys if present. read-write. This is done by parsing hiberfil.sys if present.
- Fix several occurences of a bug where we would perform 'var & ~const'
with a 64-bit variable and a int, i.e. 32-bit, constant. This causes
the higher order 32-bits of the 64-bit variable to be zeroed. To fix
this cast the 'const' to the same 64-bit type as 'var'.
2.1.22 - Many bug and race fixes and error handling improvements. 2.1.22 - Many bug and race fixes and error handling improvements.
......
...@@ -1308,7 +1308,8 @@ static int ntfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -1308,7 +1308,8 @@ static int ntfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
ntfs_debug("Handling index buffer 0x%llx.", ntfs_debug("Handling index buffer 0x%llx.",
(unsigned long long)bmp_pos + cur_bmp_pos); (unsigned long long)bmp_pos + cur_bmp_pos);
/* If the current index buffer is in the same page we reuse the page. */ /* If the current index buffer is in the same page we reuse the page. */
if ((prev_ia_pos & PAGE_CACHE_MASK) != (ia_pos & PAGE_CACHE_MASK)) { if ((prev_ia_pos & (s64)PAGE_CACHE_MASK) !=
(ia_pos & (s64)PAGE_CACHE_MASK)) {
prev_ia_pos = ia_pos; prev_ia_pos = ia_pos;
if (likely(ia_page != NULL)) { if (likely(ia_page != NULL)) {
unlock_page(ia_page); unlock_page(ia_page);
......
...@@ -110,7 +110,7 @@ struct _ntfs_inode { ...@@ -110,7 +110,7 @@ struct _ntfs_inode {
u8 block_size_bits; /* Log2 of the above. */ u8 block_size_bits; /* Log2 of the above. */
u8 vcn_size_bits; /* Log2 of the above. */ u8 vcn_size_bits; /* Log2 of the above. */
} index; } index;
struct { /* It is a compressed file or an attribute inode. */ struct { /* It is a compressed/sparse file/attribute inode. */
s64 size; /* Copy of compressed_size from s64 size; /* Copy of compressed_size from
$DATA. */ $DATA. */
u32 block_size; /* Size of a compression block u32 block_size; /* Size of a compression block
......
...@@ -293,7 +293,7 @@ runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn, ...@@ -293,7 +293,7 @@ runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn,
buf_size = i_size - last_read_pos; buf_size = i_size - last_read_pos;
buf_size <<= 3; buf_size <<= 3;
lcn = bmp_pos & 7; lcn = bmp_pos & 7;
bmp_pos &= ~7; bmp_pos &= ~(LCN)7;
ntfs_debug("Before inner while loop: buf_size %i, lcn 0x%llx, " ntfs_debug("Before inner while loop: buf_size %i, lcn 0x%llx, "
"bmp_pos 0x%llx, need_writeback %i.", buf_size, "bmp_pos 0x%llx, need_writeback %i.", buf_size,
(unsigned long long)lcn, (unsigned long long)lcn,
...@@ -311,7 +311,7 @@ runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn, ...@@ -311,7 +311,7 @@ runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn,
(unsigned int)*byte); (unsigned int)*byte);
/* Skip full bytes. */ /* Skip full bytes. */
if (*byte == 0xff) { if (*byte == 0xff) {
lcn = (lcn + 8) & ~7; lcn = (lcn + 8) & ~(LCN)7;
ntfs_debug("Continuing while loop 1."); ntfs_debug("Continuing while loop 1.");
continue; continue;
} }
......
/* /*
* logfile.c - NTFS kernel journal handling. Part of the Linux-NTFS project. * logfile.c - NTFS kernel journal handling. Part of the Linux-NTFS project.
* *
* Copyright (c) 2002-2004 Anton Altaparmakov * Copyright (c) 2002-2005 Anton Altaparmakov
* *
* This program/include file is free software; you can redistribute it and/or * This program/include file is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published * modify it under the terms of the GNU General Public License as published
...@@ -410,7 +410,7 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi, ...@@ -410,7 +410,7 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi,
} }
/** /**
* ntfs_ckeck_logfile - check in the journal if the volume is consistent * ntfs_check_logfile - check the journal for consistency
* @log_vi: struct inode of loaded journal $LogFile to check * @log_vi: struct inode of loaded journal $LogFile to check
* *
* Check the $LogFile journal for consistency and return TRUE if it is * Check the $LogFile journal for consistency and return TRUE if it is
...@@ -464,7 +464,7 @@ BOOL ntfs_check_logfile(struct inode *log_vi) ...@@ -464,7 +464,7 @@ BOOL ntfs_check_logfile(struct inode *log_vi)
* optimize log_page_size and log_page_bits into constants. * optimize log_page_size and log_page_bits into constants.
*/ */
log_page_bits = generic_ffs(log_page_size) - 1; log_page_bits = generic_ffs(log_page_size) - 1;
size &= ~(log_page_size - 1); size &= ~(s64)(log_page_size - 1);
/* /*
* Ensure the log file is big enough to store at least the two restart * Ensure the log file is big enough to store at least the two restart
* pages and the minimum number of log record pages. * pages and the minimum number of log record pages.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment