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
|