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: Anton Altaparmakov <aia21@cantab.net>
This commit is contained in:
@@ -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 @@ find_next_index_buffer:
|
|||||||
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 {
|
|||||||
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,
|
|||||||
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,
|
|||||||
(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;
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* 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 @@ err_out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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)
|
|||||||
* 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.
|
||||||
|
Reference in New Issue
Block a user