summaryrefslogtreecommitdiff
path: root/ntfs-3g/ntfs3g-2017.3.23-big-sectors.patch
blob: 1cb8bb6c46c0fc7ee0dabb085a8c5c449974389e (plain)
    1 --- a/libntfs-3g/bootsect.c.ref	2017-03-23 10:42:44.000000000 +0100
    2 +++ b/libntfs-3g/bootsect.c	2018-05-07 09:11:13.004710800 +0200
    3 @@ -38,6 +38,7 @@ 
    4  #include <errno.h>
    5  #endif
    6  
    7 +#include "param.h"
    8  #include "compat.h"
    9  #include "bootsect.h"
   10  #include "debug.h"
   11 @@ -61,6 +62,7 @@ 
   12  {
   13  	u32 i;
   14  	BOOL ret = FALSE;
   15 +	u16 sectors_per_cluster;
   16  
   17  	ntfs_log_debug("Beginning bootsector check.\n");
   18  
   19 @@ -83,15 +85,27 @@ 
   20  	case 1: case 2: case 4: case 8: case 16: case 32: case 64: case 128:
   21  		break;
   22  	default:
   23 -		ntfs_log_error("Unexpected sectors per cluster value (%d).\n",
   24 -			       b->bpb.sectors_per_cluster);
   25 -		goto not_ntfs;
   26 +		if ((b->bpb.sectors_per_cluster < 240)
   27 +		    || (b->bpb.sectors_per_cluster > 249)) {
   28 +			if (b->bpb.sectors_per_cluster > 128)
   29 +				ntfs_log_error("Unexpected sectors"
   30 +					" per cluster value (code 0x%x)\n",
   31 +					b->bpb.sectors_per_cluster);
   32 +			else
   33 +				ntfs_log_error("Unexpected sectors"
   34 +					" per cluster value (%d).\n",
   35 +					b->bpb.sectors_per_cluster);
   36 +			goto not_ntfs;
   37 +		}
   38  	}
   39  
   40  	ntfs_log_debug("Checking cluster size.\n");
   41 -	i = (u32)le16_to_cpu(b->bpb.bytes_per_sector) * 
   42 -		b->bpb.sectors_per_cluster;
   43 -	if (i > 65536) {
   44 +	if (b->bpb.sectors_per_cluster > 128)
   45 +		sectors_per_cluster = 1 << (256 - b->bpb.sectors_per_cluster);
   46 +	else
   47 +		sectors_per_cluster = b->bpb.sectors_per_cluster;
   48 +	i = (u32)le16_to_cpu(b->bpb.bytes_per_sector) * sectors_per_cluster;
   49 +	if (i > NTFS_MAX_CLUSTER_SIZE) {
   50  		ntfs_log_error("Unexpected cluster size (%d).\n", i);
   51  		goto not_ntfs;
   52  	}
   53 @@ -171,7 +185,7 @@ 
   54  int ntfs_boot_sector_parse(ntfs_volume *vol, const NTFS_BOOT_SECTOR *bs)
   55  {
   56  	s64 sectors;
   57 -	u8  sectors_per_cluster;
   58 +	u16  sectors_per_cluster;
   59  	s8  c;
   60  
   61  	/* We return -1 with errno = EINVAL on error. */
   62 @@ -186,7 +200,10 @@ 
   63  	 * below or equal the number_of_clusters) really belong in the
   64  	 * ntfs_boot_sector_is_ntfs but in this way we can just do this once.
   65  	 */
   66 -	sectors_per_cluster = bs->bpb.sectors_per_cluster;
   67 +	if (bs->bpb.sectors_per_cluster > 128)
   68 +		sectors_per_cluster = 1 << (256 - bs->bpb.sectors_per_cluster);
   69 +	else
   70 +		sectors_per_cluster = bs->bpb.sectors_per_cluster;
   71  	ntfs_log_debug("SectorsPerCluster = 0x%x\n", sectors_per_cluster);
   72  	if (sectors_per_cluster & (sectors_per_cluster - 1)) {
   73  		ntfs_log_error("sectors_per_cluster (%d) is not a power of 2."
   74 --- a/ntfsprogs/mkntfs.8.in.ref	2017-03-23 10:42:44.000000000 +0100
   75 +++ b/ntfsprogs/mkntfs.8.in	2018-05-07 09:11:13.014132400 +0200
   76 @@ -132,7 +132,7 @@ 
   77  .TP
   78  \fB\-c\fR, \fB\-\-cluster\-size\fR BYTES
   79  Specify the size of clusters in bytes. Valid cluster size values are powers of
   80 -two, with at least 256, and at most 65536 bytes per cluster. If omitted,
   81 +two, with at least 256, and at most 2097152 bytes (2MB) per cluster. If omitted,
   82  .B mkntfs
   83  uses 4096 bytes as the default cluster size.
   84  .sp
   85 --- a/ntfsprogs/mkntfs.c.ref	2017-03-23 10:42:44.000000000 +0100
   86 +++ b/ntfsprogs/mkntfs.c	2018-05-07 09:11:13.035522300 +0200
   87 @@ -6,7 +6,7 @@ 
   88   * Copyright (c) 2002-2006 Szabolcs Szakacsits
   89   * Copyright (c) 2005      Erik Sornes
   90   * Copyright (c) 2007      Yura Pakhuchiy
   91 - * Copyright (c) 2010-2014 Jean-Pierre Andre
   92 + * Copyright (c) 2010-2018 Jean-Pierre Andre
   93   *
   94   * This utility will create an NTFS 1.2 or 3.1 volume on a user
   95   * specified (block) device.
   96 @@ -119,6 +119,7 @@ 
   97  #	endif
   98  #endif
   99  
  100 +#include "param.h"
  101  #include "security.h"
  102  #include "types.h"
  103  #include "attrib.h"
  104 @@ -287,7 +288,7 @@ 
  105  	ntfs_log_info("Copyright (c) 2002-2006 Szabolcs Szakacsits\n");
  106  	ntfs_log_info("Copyright (c) 2005      Erik Sornes\n");
  107  	ntfs_log_info("Copyright (c) 2007      Yura Pakhuchiy\n");
  108 -	ntfs_log_info("Copyright (c) 2010-2014 Jean-Pierre Andre\n");
  109 +	ntfs_log_info("Copyright (c) 2010-2018 Jean-Pierre Andre\n");
  110  	ntfs_log_info("\n%s\n%s%s\n", ntfs_gpl, ntfs_bugs, ntfs_home);
  111  }
  112  
  113 @@ -3719,11 +3720,11 @@ 
  114  		/*
  115  		 * For huge volumes, grow the cluster size until the number of
  116  		 * clusters fits into 32 bits or the cluster size exceeds the
  117 -		 * maximum limit of 64kiB.
  118 +		 * maximum limit of NTFS_MAX_CLUSTER_SIZE.
  119  		 */
  120  		while (volume_size >> (ffs(vol->cluster_size) - 1 + 32)) {
  121  			vol->cluster_size <<= 1;
  122 -			if (vol->cluster_size > 65535) {
  123 +			if (vol->cluster_size >= NTFS_MAX_CLUSTER_SIZE) {
  124  				ntfs_log_error("Device is too large to hold an "
  125  						"NTFS volume (maximum size is "
  126  						"256TiB).\n");
  127 @@ -3744,15 +3745,18 @@ 
  128  				"to, or larger than, the sector size.\n");
  129  		return FALSE;
  130  	}
  131 -	if (vol->cluster_size > 128 * (u32)opts.sector_size) {
  132 +		/* Before Windows 10 Creators, the limit was 128 */
  133 +	if (vol->cluster_size > 4096 * (u32)opts.sector_size) {
  134  		ntfs_log_error("The cluster size is invalid.  It cannot be "
  135 -				"more that 128 times the size of the sector "
  136 +				"more that 4096 times the size of the sector "
  137  				"size.\n");
  138  		return FALSE;
  139  	}
  140 -	if (vol->cluster_size > 65536) {
  141 +	if (vol->cluster_size > NTFS_MAX_CLUSTER_SIZE) {
  142  		ntfs_log_error("The cluster size is invalid.  The maximum "
  143 -			"cluster size is 65536 bytes (64kiB).\n");
  144 +			"cluster size is %lu bytes (%lukiB).\n",
  145 +			(unsigned long)NTFS_MAX_CLUSTER_SIZE,
  146 +			(unsigned long)(NTFS_MAX_CLUSTER_SIZE >> 10));
  147  		return FALSE;
  148  	}
  149  	vol->cluster_size_bits = ffs(vol->cluster_size) - 1;
  150 @@ -4387,6 +4391,7 @@ 
  151  	u8 *sd;
  152  	FILE_ATTR_FLAGS extend_flags;
  153  	VOLUME_FLAGS volume_flags = const_cpu_to_le16(0);
  154 +	int sectors_per_cluster;
  155  	int nr_sysfiles;
  156  	int buf_sds_first_size;
  157  	char *buf_sds;
  158 @@ -4639,8 +4644,11 @@ 
  159  	 * already inserted, so no need to worry about these things.
  160  	 */
  161  	bs->bpb.bytes_per_sector = cpu_to_le16(opts.sector_size);
  162 -	bs->bpb.sectors_per_cluster = (u8)(g_vol->cluster_size /
  163 -			opts.sector_size);
  164 +	sectors_per_cluster = g_vol->cluster_size / opts.sector_size;
  165 +	if (sectors_per_cluster > 128)
  166 +		bs->bpb.sectors_per_cluster = 257 - ffs(sectors_per_cluster);
  167 +	else
  168 +		bs->bpb.sectors_per_cluster = sectors_per_cluster;
  169  	bs->bpb.media_type = 0xf8; /* hard disk */
  170  	bs->bpb.sectors_per_track = cpu_to_le16(opts.sectors_per_track);
  171  	ntfs_log_debug("sectors per track = %ld (0x%lx)\n",
  172 --- a/ntfsprogs/ntfsclone.c.ref	2017-03-23 10:42:44.000000000 +0100
  173 +++ b/ntfsprogs/ntfsclone.c	2018-05-07 09:11:38.245007100 +0200
  174 @@ -3,7 +3,7 @@ 
  175   *
  176   * Copyright (c) 2003-2006 Szabolcs Szakacsits
  177   * Copyright (c) 2004-2006 Anton Altaparmakov
  178 - * Copyright (c) 2010-2016 Jean-Pierre Andre
  179 + * Copyright (c) 2010-2018 Jean-Pierre Andre
  180   * Special image format support copyright (c) 2004 Per Olofsson
  181   *
  182   * Clone NTFS data and/or metadata to a sparse file, image, device or stdout.
  183 @@ -71,6 +71,7 @@ 
  184   */
  185  #define NTFS_DO_NOT_CHECK_ENDIANS
  186  
  187 +#include "param.h"
  188  #include "debug.h"
  189  #include "types.h"
  190  #include "support.h"
  191 @@ -270,7 +271,6 @@ 
  192  
  193  #define LAST_METADATA_INODE	11
  194  
  195 -#define NTFS_MAX_CLUSTER_SIZE	65536
  196  #define NTFS_SECTOR_SIZE	  512
  197  
  198  #define rounded_up_division(a, b) (((a) + (b - 1)) / (b))
  199 @@ -393,7 +393,7 @@ 
  200  		   "Efficiently clone, image, restore or rescue an NTFS Volume.\n\n"
  201  		   "Copyright (c) 2003-2006 Szabolcs Szakacsits\n"
  202  		   "Copyright (c) 2004-2006 Anton Altaparmakov\n"
  203 -		   "Copyright (c) 2010-2016 Jean-Pierre Andre\n\n");
  204 +		   "Copyright (c) 2010-2018 Jean-Pierre Andre\n\n");
  205  	fprintf(stderr, "%s\n%s%s", ntfs_gpl, ntfs_bugs, ntfs_home);
  206  	exit(0);
  207  }
  208 @@ -756,7 +756,7 @@ 
  209  
  210  static void copy_cluster(int rescue, u64 rescue_lcn, u64 lcn)
  211  {
  212 -	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
  213 +	char *buff;
  214  	/* vol is NULL if opt.restore_image is set */
  215  	s32 csize = le32_to_cpu(image_hdr.cluster_size);
  216  	BOOL backup_bootsector;
  217 @@ -783,6 +783,10 @@ 
  218  		}
  219  	}
  220  
  221 +	buff = (char*)ntfs_malloc(csize);
  222 +	if (!buff)
  223 +		err_exit("Not enough memory");
  224 +
  225  // need reading when not about to write ?
  226  	if (read_all(fd, buff, csize) == -1) {
  227  
  228 @@ -858,6 +862,7 @@ 
  229  		perr_printf("Write failed");
  230  #endif
  231  	}
  232 +	free(buff);
  233  }
  234  
  235  static s64 lseek_out(int fd, s64 pos, int mode)
  236 @@ -995,7 +1000,11 @@ 
  237  				 struct progress_bar *progress, u64 *p_counter)
  238  {
  239  	s64 i;
  240 -	char buff[NTFS_MAX_CLUSTER_SIZE];
  241 +	char *buff;
  242 +
  243 +	buff = (char*)ntfs_malloc(csize);
  244 +	if (!buff)
  245 +		err_exit("Not enough memory");
  246  
  247  	memset(buff, 0, csize);
  248  
  249 @@ -1004,6 +1013,7 @@ 
  250  			perr_exit("write_all");
  251  		progress_update(progress, ++(*p_counter));
  252  	}
  253 +	free(buff);
  254  }
  255  
  256  static void restore_image(void)
  257 @@ -1492,7 +1502,7 @@ 
  258  
  259  static void copy_wipe_mft(ntfs_walk_clusters_ctx *image, runlist *rl)
  260  {
  261 -	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
  262 +	char *buff;
  263  	void *fd;
  264  	s64 mft_no;
  265  	u32 mft_record_size;
  266 @@ -1522,6 +1532,10 @@ 
  267  		clusters_per_set = mft_record_size/csize;
  268  		records_per_set = 1;
  269  	}
  270 +	buff = (char*)ntfs_malloc(mft_record_size);
  271 +	if (!buff)
  272 +		err_exit("Not enough memory");
  273 +
  274  	mft_no = 0;
  275  	ri = rj = 0;
  276  	wi = wj = 0;
  277 @@ -1554,6 +1568,7 @@ 
  278  		}
  279  	}
  280  	image->current_lcn = current_lcn;
  281 +	free(buff);
  282  }
  283  
  284  /*
  285 @@ -1566,7 +1581,7 @@ 
  286  
  287  static void copy_wipe_i30(ntfs_walk_clusters_ctx *image, runlist *rl)
  288  {
  289 -	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
  290 +	char *buff;
  291  	void *fd;
  292  	u32 indx_record_size;
  293  	u32 csize;
  294 @@ -1595,6 +1610,10 @@ 
  295  		clusters_per_set = indx_record_size/csize;
  296  		records_per_set = 1;
  297  	}
  298 +	buff = (char*)ntfs_malloc(indx_record_size);
  299 +	if (!buff)
  300 +		err_exit("Not enough memory");
  301 +
  302  	ri = rj = 0;
  303  	wi = wj = 0;
  304  	if (rl[ri].length)
  305 @@ -1627,6 +1646,7 @@ 
  306  		}
  307  	}
  308  	image->current_lcn = current_lcn;
  309 +	free(buff);
  310  }
  311  
  312  static void dump_clusters(ntfs_walk_clusters_ctx *image, runlist *rl)
  313 --- a/ntfsprogs/ntfsresize.c.ref	2017-03-23 10:42:44.000000000 +0100
  314 +++ b/ntfsprogs/ntfsresize.c	2018-05-07 09:11:13.076883400 +0200
  315 @@ -59,6 +59,7 @@ 
  316  #include <fcntl.h>
  317  #endif
  318  
  319 +#include "param.h"
  320  #include "debug.h"
  321  #include "types.h"
  322  #include "support.h"
  323 @@ -243,8 +244,6 @@ 
  324  #define DIRTY_INODE		(1)
  325  #define DIRTY_ATTRIB		(2)
  326  
  327 -#define NTFS_MAX_CLUSTER_SIZE	(65536)
  328 -
  329  static s64 rounded_up_division(s64 numer, s64 denom)
  330  {
  331  	return (numer + (denom - 1)) / denom;
  332 @@ -404,7 +403,7 @@ 
  333  	printf("Copyright (c) 2002-2005  Anton Altaparmakov\n");
  334  	printf("Copyright (c) 2002-2003  Richard Russon\n");
  335  	printf("Copyright (c) 2007       Yura Pakhuchiy\n");
  336 -	printf("Copyright (c) 2011-2016  Jean-Pierre Andre\n");
  337 +	printf("Copyright (c) 2011-2018  Jean-Pierre Andre\n");
  338  	printf("\n%s\n%s%s", ntfs_gpl, ntfs_bugs, ntfs_home);
  339  }
  340  
  341 @@ -1849,9 +1848,13 @@ 
  342  static void copy_clusters(ntfs_resize_t *resize, s64 dest, s64 src, s64 len)
  343  {
  344  	s64 i;
  345 -	char buff[NTFS_MAX_CLUSTER_SIZE]; /* overflow checked at mount time */
  346 +	char *buff;
  347  	ntfs_volume *vol = resize->vol;
  348  
  349 +	buff = (char*)ntfs_malloc(vol->cluster_size);
  350 +	if (!buff)
  351 +		perr_exit("ntfs_malloc");
  352 +
  353  	for (i = 0; i < len; i++) {
  354  
  355  		lseek_to_cluster(vol, src + i);
  356 @@ -1875,6 +1878,7 @@ 
  357  		resize->relocations++;
  358  		progress_update(&resize->progress, resize->relocations);
  359  	}
  360 +	free(buff);
  361  }
  362  
  363  static void relocate_clusters(ntfs_resize_t *r, runlist *dest_rl, s64 src_lcn)
  364 --- a/include/ntfs-3g/param.h.ref	2017-03-23 10:42:44.000000000 +0100
  365 +++ b/include/ntfs-3g/param.h	2018-05-07 09:11:13.088302600 +0200
  366 @@ -40,6 +40,13 @@ 
  367  };
  368  
  369  /*
  370 + *		Parameters for formatting
  371 + */
  372 +
  373 +		/* Up to Windows 10, the cluster size was limited to 64K */
  374 +#define NTFS_MAX_CLUSTER_SIZE 2097152 /* Windows 10 Creators allows 2MB */
  375 +
  376 +/*
  377   *		Parameters for compression
  378   */
  379  

Generated by cgit