Przeglądaj źródła

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>

Anton Altaparmakov 20 lat temu
rodzic
commit
3bd1f4a173
5 zmienionych plików z 12 dodań i 7 usunięć
  1. 4 0
      fs/ntfs/ChangeLog
  2. 2 1
      fs/ntfs/dir.c
  3. 1 1
      fs/ntfs/inode.h
  4. 2 2
      fs/ntfs/lcnalloc.c
  5. 3 3
      fs/ntfs/logfile.c

+ 4 - 0
fs/ntfs/ChangeLog

@@ -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.
 
 

+ 2 - 1
fs/ntfs/dir.c

@@ -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);

+ 1 - 1
fs/ntfs/inode.h

@@ -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

+ 2 - 2
fs/ntfs/lcnalloc.c

@@ -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;
 			}
 			}

+ 3 - 3
fs/ntfs/logfile.c

@@ -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.