• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2019 Namjae Jeon <linkinjeon@kernel.org>
4  *   Copyright (C) 2020 Hyunchul Lee <hyc.lee@gmail.com>
5  */
6 
7 #include <unistd.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <getopt.h>
11 #include <inttypes.h>
12 #include <string.h>
13 #include <errno.h>
14 #include <locale.h>
15 
16 #include "exfat_ondisk.h"
17 #include "libexfat.h"
18 #include "repair.h"
19 #include "exfat_fs.h"
20 #include "exfat_dir.h"
21 #include "fsck.h"
22 
23 struct fsck_user_input {
24 	struct exfat_user_input		ei;
25 	enum fsck_ui_options		options;
26 };
27 
28 #define EXFAT_MAX_UPCASE_CHARS	0x10000
29 
30 #define FSCK_EXIT_NO_ERRORS		0x00
31 #define FSCK_EXIT_CORRECTED		0x01
32 #define FSCK_EXIT_NEED_REBOOT		0x02
33 #define FSCK_EXIT_ERRORS_LEFT		0x04
34 #define FSCK_EXIT_OPERATION_ERROR	0x08
35 #define FSCK_EXIT_SYNTAX_ERROR		0x10
36 #define FSCK_EXIT_USER_CANCEL		0x20
37 #define FSCK_EXIT_LIBRARY_ERROR		0x80
38 
39 struct exfat_stat {
40 	long		dir_count;
41 	long		file_count;
42 	long		error_count;
43 	long		fixed_count;
44 };
45 
46 struct exfat_fsck exfat_fsck;
47 struct exfat_stat exfat_stat;
48 struct path_resolve_ctx path_resolve_ctx;
49 
50 static struct option opts[] = {
51 	{"repair",	no_argument,	NULL,	'r' },
52 	{"repair-yes",	no_argument,	NULL,	'y' },
53 	{"repair-no",	no_argument,	NULL,	'n' },
54 	{"repair-auto",	no_argument,	NULL,	'p' },
55 	{"rescue",	no_argument,	NULL,	's' },
56 	{"version",	no_argument,	NULL,	'V' },
57 	{"verbose",	no_argument,	NULL,	'v' },
58 	{"help",	no_argument,	NULL,	'h' },
59 	{"?",		no_argument,	NULL,	'?' },
60 	{"ignore-bad-fs",	no_argument,	NULL,	'b' },
61 	{NULL,		0,		NULL,	 0  }
62 };
63 
usage(char * name)64 static void usage(char *name)
65 {
66 	fprintf(stderr, "Usage: %s\n", name);
67 	fprintf(stderr, "\t-r | --repair        Repair interactively\n");
68 	fprintf(stderr, "\t-y | --repair-yes    Repair without ask\n");
69 	fprintf(stderr, "\t-n | --repair-no     No repair\n");
70 	fprintf(stderr, "\t-p | --repair-auto   Repair automatically\n");
71 	fprintf(stderr, "\t-a                   Repair automatically\n");
72 	fprintf(stderr, "\t-b | --ignore-bad-fs Try to recover even if exfat is not found\n");
73 	fprintf(stderr, "\t-s | --rescue        Assign orphaned clusters to files\n");
74 	fprintf(stderr, "\t-V | --version       Show version\n");
75 	fprintf(stderr, "\t-v | --verbose       Print debug\n");
76 	fprintf(stderr, "\t-h | --help          Show help\n");
77 
78 	exit(FSCK_EXIT_SYNTAX_ERROR);
79 }
80 
81 #define fsck_err(parent, inode, fmt, ...)		\
82 ({							\
83 		exfat_resolve_path_parent(&path_resolve_ctx,	\
84 			parent, inode);			\
85 		exfat_err("ERROR: %s: " fmt,		\
86 			path_resolve_ctx.local_path,	\
87 			##__VA_ARGS__);			\
88 })
89 
90 #define repair_file_ask(iter, inode, code, fmt, ...)	\
91 ({							\
92 		if (inode)						\
93 			exfat_resolve_path_parent(&path_resolve_ctx,	\
94 					    (iter)->parent, inode);	\
95 		else							\
96 			exfat_resolve_path(&path_resolve_ctx,		\
97 				     (iter)->parent);			\
98 		exfat_repair_ask(&exfat_fsck, code,			\
99 				 "ERROR: %s: " fmt " at %#" PRIx64,	\
100 				 path_resolve_ctx.local_path,		\
101 				 ##__VA_ARGS__,				\
102 				 exfat_de_iter_device_offset(iter));	\
103 })
104 
check_clus_chain(struct exfat_de_iter * de_iter,int stream_idx,struct exfat_inode * node)105 static int check_clus_chain(struct exfat_de_iter *de_iter, int stream_idx,
106 			    struct exfat_inode *node)
107 {
108 	struct exfat *exfat = de_iter->exfat;
109 	struct exfat_dentry *stream_de;
110 	clus_t clus, prev, next;
111 	uint64_t count, max_count;
112 
113 	clus = node->first_clus;
114 	prev = EXFAT_EOF_CLUSTER;
115 	count = 0;
116 	max_count = DIV_ROUND_UP(node->size, exfat->clus_size);
117 
118 	if (node->size == 0 && node->first_clus == EXFAT_FREE_CLUSTER)
119 		return 0;
120 
121 	/* the first cluster is wrong */
122 	if ((node->size == 0 && node->first_clus != EXFAT_FREE_CLUSTER) ||
123 	    (node->size > 0 && !exfat_heap_clus(exfat, node->first_clus))) {
124 		if (repair_file_ask(de_iter, node,
125 				    ER_FILE_FIRST_CLUS,
126 				    "size %#" PRIx64 ", but the first cluster %#x",
127 				    node->size, node->first_clus))
128 			goto truncate_file;
129 		else
130 			return -EINVAL;
131 	}
132 
133 	while (clus != EXFAT_EOF_CLUSTER) {
134 		if (count >= max_count) {
135 			if (node->is_contiguous)
136 				break;
137 			if (repair_file_ask(de_iter, node,
138 					    ER_FILE_SMALLER_SIZE,
139 					    "more clusters are allocated. truncate to %"
140 					    PRIu64 " bytes",
141 					    count * exfat->clus_size))
142 				goto truncate_file;
143 			else
144 				return -EINVAL;
145 		}
146 
147 		/*
148 		 * This cluster is already allocated. it may be shared with
149 		 * the other file, or there is a loop in cluster chain.
150 		 */
151 		if (exfat_bitmap_get(exfat->alloc_bitmap, clus)) {
152 			if (repair_file_ask(de_iter, node,
153 					    ER_FILE_DUPLICATED_CLUS,
154 					    "cluster is already allocated for the other file. truncated to %"
155 					    PRIu64 " bytes",
156 					    count * exfat->clus_size))
157 				goto truncate_file;
158 			else
159 				return -EINVAL;
160 		}
161 
162 		if (!exfat_bitmap_get(exfat->disk_bitmap, clus)) {
163 			if (!repair_file_ask(de_iter, node,
164 					     ER_FILE_INVALID_CLUS,
165 					     "cluster %#x is marked as free",
166 					     clus))
167 				return -EINVAL;
168 		}
169 
170 		/* This cluster is allocated or not */
171 		if (exfat_get_inode_next_clus(exfat, node, clus, &next))
172 			goto truncate_file;
173 		if (next == EXFAT_BAD_CLUSTER) {
174 			if (repair_file_ask(de_iter, node,
175 					    ER_FILE_INVALID_CLUS,
176 					    "BAD cluster. truncate to %"
177 					    PRIu64 " bytes",
178 					    count * exfat->clus_size))
179 				goto truncate_file;
180 			else
181 				return -EINVAL;
182 		} else if (!node->is_contiguous) {
183 			if (next != EXFAT_EOF_CLUSTER &&
184 			    !exfat_heap_clus(exfat, next)) {
185 				if (repair_file_ask(de_iter, node,
186 						    ER_FILE_INVALID_CLUS,
187 						    "broken cluster chain. truncate to %"
188 						    PRIu64 " bytes",
189 						    (count + 1) * exfat->clus_size)) {
190 					count++;
191 					prev = clus;
192 					exfat_bitmap_set(exfat->alloc_bitmap,
193 							 clus);
194 					goto truncate_file;
195 				} else {
196 					return -EINVAL;
197 				}
198 			}
199 		}
200 
201 		count++;
202 		exfat_bitmap_set(exfat->alloc_bitmap, clus);
203 		prev = clus;
204 		clus = next;
205 	}
206 
207 	if (count < max_count) {
208 		if (repair_file_ask(de_iter, node, ER_FILE_LARGER_SIZE,
209 				    "less clusters are allocated. truncates to %"
210 				    PRIu64 " bytes",
211 				    count * exfat->clus_size))
212 			goto truncate_file;
213 		else
214 			return -EINVAL;
215 	}
216 
217 	return 0;
218 truncate_file:
219 	node->size = count * exfat->clus_size;
220 	if (!exfat_heap_clus(exfat, prev))
221 		node->first_clus = EXFAT_FREE_CLUSTER;
222 
223 	exfat_de_iter_get_dirty(de_iter, stream_idx, &stream_de);
224 	if (stream_idx == 1 && count * exfat->clus_size <
225 	    le64_to_cpu(stream_de->stream_valid_size))
226 		stream_de->stream_valid_size = cpu_to_le64(
227 							   count * exfat->clus_size);
228 	if (!exfat_heap_clus(exfat, prev))
229 		stream_de->stream_start_clu = EXFAT_FREE_CLUSTER;
230 	stream_de->stream_size = cpu_to_le64(
231 					     count * exfat->clus_size);
232 
233 	/* remaining clusters will be freed while FAT is compared with
234 	 * alloc_bitmap.
235 	 */
236 	if (!node->is_contiguous && exfat_heap_clus(exfat, prev)) {
237 		if (exfat_set_fat(exfat, prev, EXFAT_EOF_CLUSTER))
238 			return -EIO;
239 	}
240 	return 1;
241 }
242 
root_check_clus_chain(struct exfat * exfat,struct exfat_inode * node,clus_t * clus_count)243 static int root_check_clus_chain(struct exfat *exfat,
244 				 struct exfat_inode *node,
245 				 clus_t *clus_count)
246 {
247 	clus_t clus, next, prev = EXFAT_EOF_CLUSTER;
248 
249 	if (!exfat_heap_clus(exfat, node->first_clus))
250 		goto out_trunc;
251 
252 	clus = node->first_clus;
253 	*clus_count = 0;
254 
255 	do {
256 		if (exfat_bitmap_get(exfat->alloc_bitmap, clus)) {
257 			if (exfat_repair_ask(&exfat_fsck,
258 					     ER_FILE_DUPLICATED_CLUS,
259 					     "ERROR: the cluster chain of root is cyclic"))
260 				goto out_trunc;
261 			return -EINVAL;
262 		}
263 
264 		exfat_bitmap_set(exfat->alloc_bitmap, clus);
265 
266 		if (exfat_get_inode_next_clus(exfat, node, clus, &next)) {
267 			exfat_err("ERROR: failed to read the fat entry of root");
268 			goto out_trunc;
269 		}
270 
271 		if (next != EXFAT_EOF_CLUSTER && !exfat_heap_clus(exfat, next)) {
272 			if (exfat_repair_ask(&exfat_fsck,
273 					     ER_FILE_INVALID_CLUS,
274 					     "ERROR: the cluster chain of root is broken")) {
275 				if (next != EXFAT_BAD_CLUSTER) {
276 					prev = clus;
277 					(*clus_count)++;
278 				}
279 				goto out_trunc;
280 			}
281 			return -EINVAL;
282 		}
283 
284 		prev = clus;
285 		clus = next;
286 		(*clus_count)++;
287 	} while (clus != EXFAT_EOF_CLUSTER);
288 
289 	return 0;
290 out_trunc:
291 	if (!exfat_heap_clus(exfat, prev)) {
292 		exfat_err("ERROR: the start cluster of root is wrong\n");
293 		return -EINVAL;
294 	}
295 	node->size = *clus_count * exfat->clus_size;
296 	return exfat_set_fat(exfat, prev, EXFAT_EOF_CLUSTER);
297 }
298 
boot_region_checksum(int dev_fd,int bs_offset,unsigned int sect_size)299 static int boot_region_checksum(int dev_fd,
300 				int bs_offset, unsigned int sect_size)
301 {
302 	void *sect;
303 	unsigned int i;
304 	uint32_t checksum;
305 	int ret = 0;
306 
307 	sect = malloc(sect_size);
308 	if (!sect)
309 		return -ENOMEM;
310 
311 	checksum = 0;
312 	for (i = 0; i < 11; i++) {
313 		if (exfat_read(dev_fd, sect, sect_size,
314 				bs_offset * sect_size + i * sect_size) !=
315 				(ssize_t)sect_size) {
316 			exfat_err("failed to read boot region\n");
317 			ret = -EIO;
318 			goto out;
319 		}
320 		boot_calc_checksum(sect, sect_size, i == 0, &checksum);
321 	}
322 
323 	if (exfat_read(dev_fd, sect, sect_size,
324 			bs_offset * sect_size + 11 * sect_size) !=
325 			(ssize_t)sect_size) {
326 		exfat_err("failed to read a boot checksum sector\n");
327 		ret = -EIO;
328 		goto out;
329 	}
330 
331 	for (i = 0; i < sect_size/sizeof(checksum); i++) {
332 		if (le32_to_cpu(((__le32 *)sect)[i]) != checksum) {
333 			exfat_err("checksum of boot region is not correct. %#x, but expected %#x\n",
334 				le32_to_cpu(((__le32 *)sect)[i]), checksum);
335 			ret = -EINVAL;
336 			goto out;
337 		}
338 	}
339 out:
340 	free(sect);
341 	return ret;
342 }
343 
exfat_mark_volume_dirty(struct exfat * exfat,bool dirty)344 static int exfat_mark_volume_dirty(struct exfat *exfat, bool dirty)
345 {
346 	uint16_t flags;
347 
348 	flags = le16_to_cpu(exfat->bs->bsx.vol_flags);
349 	if (dirty)
350 		flags |= 0x02;
351 	else
352 		flags &= ~0x02;
353 
354 	exfat->bs->bsx.vol_flags = cpu_to_le16(flags);
355 	if (exfat_write(exfat->blk_dev->dev_fd, exfat->bs,
356 			sizeof(struct pbr), 0) != (ssize_t)sizeof(struct pbr)) {
357 		exfat_err("failed to set VolumeDirty\n");
358 		return -EIO;
359 	}
360 
361 	if (fsync(exfat->blk_dev->dev_fd) != 0) {
362 		exfat_err("failed to set VolumeDirty\n");
363 		return -EIO;
364 	}
365 	return 0;
366 }
367 
read_boot_region(struct exfat_blk_dev * bd,struct pbr ** pbr,int bs_offset,unsigned int sect_size,bool verbose)368 static int read_boot_region(struct exfat_blk_dev *bd, struct pbr **pbr,
369 			    int bs_offset, unsigned int sect_size,
370 			    bool verbose)
371 {
372 	struct pbr *bs;
373 	int ret = -EINVAL;
374 	unsigned long long clu_max_count;
375 
376 	*pbr = NULL;
377 	bs = malloc(sizeof(struct pbr));
378 	if (!bs) {
379 		exfat_err("failed to allocate memory\n");
380 		return -ENOMEM;
381 	}
382 
383 	if (exfat_read(bd->dev_fd, bs, sizeof(*bs),
384 			bs_offset * sect_size) != (ssize_t)sizeof(*bs)) {
385 		exfat_err("failed to read a boot sector\n");
386 		ret = -EIO;
387 		goto err;
388 	}
389 
390 	if (memcmp(bs->bpb.oem_name, "EXFAT   ", 8) != 0) {
391 		if (verbose)
392 			exfat_err("failed to find exfat file system\n");
393 		goto err;
394 	}
395 
396 	ret = boot_region_checksum(bd->dev_fd, bs_offset, sect_size);
397 	if (ret < 0)
398 		goto err;
399 
400 	ret = -EINVAL;
401 	if (EXFAT_SECTOR_SIZE(bs) < 512 || EXFAT_SECTOR_SIZE(bs) > 4 * KB) {
402 		if (verbose)
403 			exfat_err("too small or big sector size: %d\n",
404 				  EXFAT_SECTOR_SIZE(bs));
405 		goto err;
406 	}
407 
408 	if (EXFAT_CLUSTER_SIZE(bs) > 32 * MB) {
409 		if (verbose)
410 			exfat_err("too big cluster size: %d\n",
411 				  EXFAT_CLUSTER_SIZE(bs));
412 		goto err;
413 	}
414 
415 	if (bs->bsx.fs_version[1] != 1 || bs->bsx.fs_version[0] != 0) {
416 		if (verbose)
417 			exfat_err("unsupported exfat version: %d.%d\n",
418 				  bs->bsx.fs_version[1], bs->bsx.fs_version[0]);
419 		goto err;
420 	}
421 
422 	if (bs->bsx.num_fats != 1) {
423 		if (verbose)
424 			exfat_err("unsupported FAT count: %d\n",
425 				  bs->bsx.num_fats);
426 		goto err;
427 	}
428 
429 	if (le64_to_cpu(bs->bsx.vol_length) * EXFAT_SECTOR_SIZE(bs) >
430 			bd->size) {
431 		if (verbose)
432 			exfat_err("too large sector count: %" PRIu64 ", expected: %llu\n",
433 				  le64_to_cpu(bs->bsx.vol_length),
434 				  bd->num_sectors);
435 		goto err;
436 	}
437 
438 	clu_max_count = (le64_to_cpu(bs->bsx.vol_length) - le32_to_cpu(bs->bsx.clu_offset)) >>
439 				bs->bsx.sect_per_clus_bits;
440 	if (le32_to_cpu(bs->bsx.clu_count) > clu_max_count) {
441 		if (verbose)
442 			exfat_err("too large cluster count: %u, expected: %llu\n",
443 				  le32_to_cpu(bs->bsx.clu_count),
444 				  MIN(clu_max_count, EXFAT_MAX_NUM_CLUSTER));
445 		goto err;
446 	}
447 
448 	*pbr = bs;
449 	return 0;
450 err:
451 	free(bs);
452 	return ret;
453 }
454 
restore_boot_region(struct exfat_blk_dev * bd,unsigned int sect_size)455 static int restore_boot_region(struct exfat_blk_dev *bd, unsigned int sect_size)
456 {
457 	int i;
458 	char *sector;
459 	int ret;
460 
461 	sector = malloc(sect_size);
462 	if (!sector)
463 		return -ENOMEM;
464 
465 	for (i = 0; i < 12; i++) {
466 		if (exfat_read(bd->dev_fd, sector, sect_size,
467 				BACKUP_BOOT_SEC_IDX * sect_size +
468 				i * sect_size) !=
469 				(ssize_t)sect_size) {
470 			ret = -EIO;
471 			goto free_sector;
472 		}
473 		if (i == 0)
474 			((struct pbr *)sector)->bsx.perc_in_use = 0xff;
475 
476 		if (exfat_write(bd->dev_fd, sector, sect_size,
477 				BOOT_SEC_IDX * sect_size +
478 				i * sect_size) !=
479 				(ssize_t)sect_size) {
480 			ret = -EIO;
481 			goto free_sector;
482 		}
483 	}
484 
485 	if (fsync(bd->dev_fd)) {
486 		ret = -EIO;
487 		goto free_sector;
488 	}
489 	ret = 0;
490 
491 free_sector:
492 	free(sector);
493 	return ret;
494 }
495 
exfat_boot_region_check(struct exfat_blk_dev * blkdev,struct pbr ** bs,bool ignore_bad_fs_name)496 static int exfat_boot_region_check(struct exfat_blk_dev *blkdev,
497 				   struct pbr **bs,
498 				   bool ignore_bad_fs_name)
499 {
500 	struct pbr *boot_sect;
501 	unsigned int sect_size;
502 	int ret;
503 
504 	/* First, find out the exfat sector size */
505 	boot_sect = malloc(sizeof(*boot_sect));
506 	if (boot_sect == NULL)
507 		return -ENOMEM;
508 
509 	if (exfat_read(blkdev->dev_fd, boot_sect,
510 		       sizeof(*boot_sect), 0) != (ssize_t)sizeof(*boot_sect)) {
511 		exfat_err("failed to read Main boot sector\n");
512 		free(boot_sect);
513 		return -EIO;
514 	}
515 
516 	if (memcmp(boot_sect->bpb.oem_name, "EXFAT   ", 8) != 0 &&
517 	    !ignore_bad_fs_name) {
518 		exfat_err("Bad fs_name in boot sector, which does not describe a valid exfat filesystem\n");
519 		free(boot_sect);
520 		return -ENOTSUP;
521 	}
522 
523 	sect_size = 1 << boot_sect->bsx.sect_size_bits;
524 	free(boot_sect);
525 
526 	/* check boot regions */
527 	ret = read_boot_region(blkdev, bs,
528 			       BOOT_SEC_IDX, sect_size, true);
529 	if (ret == -EINVAL &&
530 	    exfat_repair_ask(&exfat_fsck, ER_BS_BOOT_REGION,
531 			     "boot region is corrupted. try to restore the region from backup"
532 				)) {
533 		const unsigned int sector_sizes[] = {512, 4096, 1024, 2048};
534 		unsigned int i;
535 
536 		if (sect_size >= 512 && sect_size <= EXFAT_MAX_SECTOR_SIZE) {
537 			ret = read_boot_region(blkdev, bs,
538 					       BACKUP_BOOT_SEC_IDX, sect_size,
539 					       false);
540 			if (!ret)
541 				goto restore;
542 		}
543 
544 		for (i = 0; i < sizeof(sector_sizes)/sizeof(sector_sizes[0]); i++) {
545 			if (sector_sizes[i] == sect_size)
546 				continue;
547 
548 			ret = read_boot_region(blkdev, bs,
549 					       BACKUP_BOOT_SEC_IDX,
550 					       sector_sizes[i], false);
551 			if (!ret) {
552 				sect_size = sector_sizes[i];
553 				goto restore;
554 			}
555 		}
556 		exfat_err("backup boot region is also corrupted\n");
557 	}
558 
559 	return ret;
560 restore:
561 	ret = restore_boot_region(blkdev, sect_size);
562 	if (ret) {
563 		exfat_err("failed to restore boot region from backup\n");
564 		free(*bs);
565 		*bs = NULL;
566 	}
567 	return ret;
568 }
569 
file_calc_checksum(struct exfat_de_iter * iter,uint16_t * checksum)570 static int file_calc_checksum(struct exfat_de_iter *iter, uint16_t *checksum)
571 {
572 	struct exfat_dentry *file_de, *de;
573 	int i, ret;
574 
575 	*checksum = 0;
576 	ret = exfat_de_iter_get(iter, 0, &file_de);
577 	if (ret)
578 		return ret;
579 
580 	exfat_calc_dentry_checksum(file_de, checksum, true);
581 	for (i = 1; i <= file_de->file_num_ext; i++) {
582 		ret = exfat_de_iter_get(iter, i, &de);
583 		if (ret)
584 			return ret;
585 		exfat_calc_dentry_checksum(de, checksum, false);
586 	}
587 	return 0;
588 }
589 
590 /*
591  * return 0 if there are no errors, or 1 if errors are fixed, or
592  * an error code
593  */
check_inode(struct exfat_de_iter * iter,struct exfat_inode * node)594 static int check_inode(struct exfat_de_iter *iter, struct exfat_inode *node)
595 {
596 	struct exfat *exfat = iter->exfat;
597 	struct exfat_dentry *dentry;
598 	int ret = 0;
599 	uint16_t checksum;
600 	bool valid = true;
601 
602 	ret = check_clus_chain(iter, 1, node);
603 	if (ret < 0)
604 		return ret;
605 
606 	if (node->size > le32_to_cpu(exfat->bs->bsx.clu_count) *
607 				(uint64_t)exfat->clus_size) {
608 		fsck_err(iter->parent, node,
609 			"size %" PRIu64 " is greater than cluster heap\n",
610 			node->size);
611 		valid = false;
612 	}
613 
614 	if (node->size == 0 && node->is_contiguous) {
615 		if (repair_file_ask(iter, node, ER_FILE_ZERO_NOFAT,
616 				"empty, but has no Fat chain")) {
617 			exfat_de_iter_get_dirty(iter, 1, &dentry);
618 			dentry->stream_flags &= ~EXFAT_SF_CONTIGUOUS;
619 			ret = 1;
620 		} else
621 			valid = false;
622 	}
623 
624 	if ((node->attr & ATTR_SUBDIR) &&
625 			node->size % exfat->clus_size != 0) {
626 		fsck_err(iter->parent, node,
627 			"directory size %" PRIu64 " is not divisible by %d\n",
628 			node->size, exfat->clus_size);
629 		valid = false;
630 	}
631 
632 	ret = file_calc_checksum(iter, &checksum);
633 	if (ret)
634 		return ret;
635 	exfat_de_iter_get(iter, 0, &dentry);
636 	if (checksum != le16_to_cpu(dentry->file_checksum)) {
637 		exfat_de_iter_get_dirty(iter, 0, &dentry);
638 		dentry->file_checksum = cpu_to_le16(checksum);
639 		ret = 1;
640 	}
641 
642 	return valid ? ret : -EINVAL;
643 }
644 
handle_duplicated_filename(struct exfat_de_iter * iter,struct exfat_inode * inode)645 static int handle_duplicated_filename(struct exfat_de_iter *iter,
646 		struct exfat_inode *inode)
647 {
648 	int ret;
649 	struct exfat_lookup_filter filter;
650 
651 	ret = exfat_lookup_file_by_utf16name(iter->exfat, iter->parent,
652 			inode->name, &filter);
653 	if (ret)
654 		return ret;
655 
656 	free(filter.out.dentry_set);
657 
658 	/* Hash is same, but filename is not same */
659 	if (exfat_de_iter_device_offset(iter) == filter.out.dev_offset)
660 		return 0;
661 
662 	return exfat_repair_rename_ask(&exfat_fsck, iter, inode->name,
663 			ER_DE_DUPLICATED_NAME, "filename is duplicated");
664 }
665 
check_name_dentry_set(struct exfat_de_iter * iter,struct exfat_inode * inode)666 static int check_name_dentry_set(struct exfat_de_iter *iter,
667 				 struct exfat_inode *inode)
668 {
669 	struct exfat_dentry *stream_de;
670 	size_t name_len;
671 	__u16 hash;
672 	int ret = 0;
673 
674 	exfat_de_iter_get(iter, 1, &stream_de);
675 
676 	name_len = exfat_utf16_len(inode->name, NAME_BUFFER_SIZE);
677 	if (name_len && stream_de->stream_name_len != name_len) {
678 		if (repair_file_ask(iter, NULL, ER_DE_NAME_LEN,
679 				    "the name length of a file is wrong")) {
680 			exfat_de_iter_get_dirty(iter, 1, &stream_de);
681 			stream_de->stream_name_len = (__u8)name_len;
682 			ret = 1;
683 		} else {
684 			return -EINVAL;
685 		}
686 	}
687 
688 	ret = exfat_check_name(inode->name, stream_de->stream_name_len);
689 	if (ret != stream_de->stream_name_len) {
690 		char err_msg[36];
691 
692 		snprintf(err_msg, sizeof(err_msg),
693 			"filename has invalid character '%c'",
694 			le16_to_cpu(inode->name[ret]));
695 
696 		return exfat_repair_rename_ask(&exfat_fsck, iter, inode->name,
697 			ER_DE_INVALID_NAME, err_msg);
698 	}
699 
700 	hash = exfat_calc_name_hash(iter->exfat, inode->name, (int)name_len);
701 	if (cpu_to_le16(hash) != stream_de->stream_name_hash) {
702 		if (repair_file_ask(iter, NULL, ER_DE_NAME_HASH,
703 				    "the name hash of a file is wrong")) {
704 			exfat_de_iter_get_dirty(iter, 1, &stream_de);
705 			stream_de->stream_name_hash = cpu_to_le16(hash);
706 			ret = 1;
707 		} else {
708 			return -EINVAL;
709 		}
710 	}
711 
712 	if (BITMAP_GET(iter->name_hash_bitmap, hash)) {
713 		ret = handle_duplicated_filename(iter, inode);
714 	} else
715 		BITMAP_SET(iter->name_hash_bitmap, hash);
716 
717 	return ret;
718 }
719 
handle_dot_dotdot_filename(struct exfat_de_iter * iter,__le16 * filename,int strm_name_len)720 static int handle_dot_dotdot_filename(struct exfat_de_iter *iter,
721 				      __le16 *filename,
722 				      int strm_name_len)
723 {
724 	int i;
725 
726 	for (i = 0; i < strm_name_len; i++) {
727 		if (filename[i] != UTF16_DOT)
728 			return 0;
729 	}
730 
731 	if (filename[i])
732 		return 0;
733 
734 	return exfat_repair_rename_ask(&exfat_fsck, iter, filename,
735 			ER_DE_DOT_NAME, "filename is not allowed");
736 }
737 
read_file_dentry_set(struct exfat_de_iter * iter,struct exfat_inode ** new_node,int * skip_dentries)738 static int read_file_dentry_set(struct exfat_de_iter *iter,
739 				struct exfat_inode **new_node, int *skip_dentries)
740 {
741 	struct exfat_dentry *file_de, *stream_de, *dentry;
742 	struct exfat_inode *node = NULL;
743 	int i, j, ret, name_de_count;
744 	bool need_delete = false, need_copy_up = false;
745 	uint16_t checksum;
746 
747 	ret = exfat_de_iter_get(iter, 0, &file_de);
748 	if (ret || file_de->type != EXFAT_FILE) {
749 		exfat_err("failed to get file dentry\n");
750 		return -EINVAL;
751 	}
752 
753 	ret = file_calc_checksum(iter, &checksum);
754 	if (ret || checksum != le16_to_cpu(file_de->file_checksum)) {
755 		if (repair_file_ask(iter, NULL, ER_DE_CHECKSUM,
756 				    "the checksum %#x of a file is wrong, expected: %#x",
757 				    le16_to_cpu(file_de->file_checksum), checksum))
758 			need_delete = true;
759 		*skip_dentries = 1;
760 		goto skip_dset;
761 	}
762 
763 	if (file_de->file_num_ext < 2) {
764 		if (repair_file_ask(iter, NULL, ER_DE_SECONDARY_COUNT,
765 				    "a file has too few secondary count. %d",
766 				    file_de->file_num_ext))
767 			need_delete = true;
768 		*skip_dentries = 1;
769 		goto skip_dset;
770 	}
771 
772 	ret = exfat_de_iter_get(iter, 1, &stream_de);
773 	if (ret || stream_de->type != EXFAT_STREAM) {
774 		if (repair_file_ask(iter, NULL, ER_DE_STREAM,
775 				    "failed to get stream dentry"))
776 			need_delete = true;
777 		*skip_dentries = 2;
778 		goto skip_dset;
779 	}
780 
781 	*new_node = NULL;
782 	node = exfat_alloc_inode(le16_to_cpu(file_de->file_attr));
783 	if (!node)
784 		return -ENOMEM;
785 
786 	name_de_count = DIV_ROUND_UP(stream_de->stream_name_len, ENTRY_NAME_MAX);
787 	for (i = 2; i <= MIN(name_de_count + 1, file_de->file_num_ext); i++) {
788 		ret = exfat_de_iter_get(iter, i, &dentry);
789 		if (ret || dentry->type != EXFAT_NAME) {
790 			if (repair_file_ask(iter, NULL, ER_DE_NAME,
791 					    "failed to get name dentry")) {
792 				if (i == 2) {
793 					need_delete = 1;
794 					*skip_dentries = i + 1;
795 					goto skip_dset;
796 				}
797 				break;
798 			} else {
799 				*skip_dentries = i + 1;
800 				goto skip_dset;
801 			}
802 		}
803 
804 		memcpy(node->name +
805 		       (i - 2) * ENTRY_NAME_MAX, dentry->name_unicode,
806 		       sizeof(dentry->name_unicode));
807 	}
808 
809 	ret = check_name_dentry_set(iter, node);
810 	if (ret < 0) {
811 		*skip_dentries = file_de->file_num_ext + 1;
812 		goto skip_dset;
813 	} else if (ret) {
814 		exfat_de_iter_get(iter, 1, &stream_de);
815 		if (DIV_ROUND_UP(stream_de->stream_name_len, ENTRY_NAME_MAX) !=
816 		    name_de_count)
817 			i = DIV_ROUND_UP(stream_de->stream_name_len, ENTRY_NAME_MAX) + 2;
818 	}
819 
820 	if (file_de->file_num_ext == 2 && stream_de->stream_name_len <= 2) {
821 		ret = handle_dot_dotdot_filename(iter, node->name,
822 				stream_de->stream_name_len);
823 		if (ret < 0) {
824 			*skip_dentries = file_de->file_num_ext + 1;
825 			goto skip_dset;
826 		}
827 	}
828 
829 	for (j = i; i <= file_de->file_num_ext; i++) {
830 		exfat_de_iter_get(iter, i, &dentry);
831 		if (dentry->type == EXFAT_VENDOR_EXT ||
832 		    dentry->type == EXFAT_VENDOR_ALLOC) {
833 			char zeroes[EXFAT_GUID_LEN] = {0};
834 			/*
835 			 * Vendor GUID should not be zero, But Windows fsck
836 			 * also does not check and fix it.
837 			 */
838 			if (!memcmp(dentry->dentry.vendor_ext.guid,
839 				    zeroes, EXFAT_GUID_LEN))
840 				repair_file_ask(iter, NULL, ER_VENDOR_GUID,
841 						"Vendor Extension has zero filled GUID");
842 			if (dentry->type == EXFAT_VENDOR_ALLOC) {
843 				struct exfat_inode *vendor_node;
844 
845 				/* verify cluster chain */
846 				vendor_node = exfat_alloc_inode(0);
847 				if (!vendor_node) {
848 					*skip_dentries = i + i;
849 					goto skip_dset;
850 				}
851 				vendor_node->first_clus =
852 					le32_to_cpu(dentry->dentry.vendor_alloc.start_clu);
853 				vendor_node->is_contiguous = ((dentry->dentry.vendor_alloc.flags
854 							       & EXFAT_SF_CONTIGUOUS) != 0);
855 				vendor_node->size =
856 					le64_to_cpu(dentry->dentry.vendor_alloc.size);
857 				if (check_clus_chain(iter, i, vendor_node) < 0) {
858 					exfat_free_inode(vendor_node);
859 					*skip_dentries = i + 1;
860 					goto skip_dset;
861 				}
862 				if (vendor_node->size == 0 &&
863 				    vendor_node->is_contiguous) {
864 					exfat_de_iter_get_dirty(iter, i, &dentry);
865 					dentry->stream_flags &= ~EXFAT_SF_CONTIGUOUS;
866 
867 				}
868 				exfat_free_inode(vendor_node);
869 			}
870 
871 			if (need_copy_up) {
872 				struct exfat_dentry *src_de;
873 
874 				exfat_de_iter_get_dirty(iter, j, &src_de);
875 				memcpy(src_de, dentry, sizeof(struct exfat_dentry));
876 			}
877 			j++;
878 		} else {
879 			if (need_copy_up) {
880 				continue;
881 			} else if (repair_file_ask(iter, NULL, ER_DE_UNKNOWN,
882 						  "unknown entry type %#x", dentry->type)) {
883 				j = i;
884 				need_copy_up = true;
885 			} else {
886 				*skip_dentries = i + 1;
887 				goto skip_dset;
888 			}
889 		}
890 	}
891 
892 	node->first_clus = le32_to_cpu(stream_de->stream_start_clu);
893 	node->is_contiguous =
894 		((stream_de->stream_flags & EXFAT_SF_CONTIGUOUS) != 0);
895 	node->size = le64_to_cpu(stream_de->stream_size);
896 
897 	if (node->size < le64_to_cpu(stream_de->stream_valid_size)) {
898 		*skip_dentries = file_de->file_num_ext + 1;
899 		if (repair_file_ask(iter, node, ER_FILE_VALID_SIZE,
900 				    "valid size %" PRIu64 " greater than size %" PRIu64,
901 				    le64_to_cpu(stream_de->stream_valid_size),
902 				    node->size)) {
903 			exfat_de_iter_get_dirty(iter, 1, &stream_de);
904 			stream_de->stream_valid_size =
905 					stream_de->stream_size;
906 		} else {
907 			*skip_dentries = file_de->file_num_ext + 1;
908 			goto skip_dset;
909 		}
910 	}
911 
912 	if (file_de->file_num_ext != j - 1) {
913 		if (repair_file_ask(iter, node, ER_DE_SECONDARY_COUNT,
914 				    "SecondaryCount %d is different with %d",
915 				    file_de->file_num_ext, j - 1)) {
916 			exfat_de_iter_get_dirty(iter, 0, &file_de);
917 			file_de->file_num_ext = j - 1;
918 		} else {
919 			*skip_dentries = file_de->file_num_ext + 1;
920 			goto skip_dset;
921 		}
922 	}
923 
924 	*skip_dentries = (file_de->file_num_ext + 1);
925 	*new_node = node;
926 	return 0;
927 skip_dset:
928 	if (need_delete) {
929 		exfat_de_iter_get_dirty(iter, 0, &dentry);
930 		dentry->type &= EXFAT_DELETE;
931 	}
932 	for (i = 1; i < *skip_dentries; i++) {
933 		exfat_de_iter_get(iter, i, &dentry);
934 		if (dentry->type == EXFAT_FILE)
935 			break;
936 		if (need_delete) {
937 			exfat_de_iter_get_dirty(iter, i, &dentry);
938 			dentry->type &= EXFAT_DELETE;
939 		}
940 	}
941 	*skip_dentries = i;
942 	*new_node = NULL;
943 	exfat_free_inode(node);
944 	return need_delete ? 1 : -EINVAL;
945 }
946 
read_file(struct exfat_de_iter * de_iter,struct exfat_inode ** new_node,int * dentry_count)947 static int read_file(struct exfat_de_iter *de_iter,
948 		struct exfat_inode **new_node, int *dentry_count)
949 {
950 	struct exfat_inode *node;
951 	int ret;
952 
953 	*new_node = NULL;
954 
955 	ret = read_file_dentry_set(de_iter, &node, dentry_count);
956 	if (ret)
957 		return ret;
958 
959 	ret = check_inode(de_iter, node);
960 	if (ret < 0) {
961 		exfat_free_inode(node);
962 		return -EINVAL;
963 	}
964 
965 	if (node->attr & ATTR_SUBDIR)
966 		exfat_stat.dir_count++;
967 	else
968 		exfat_stat.file_count++;
969 	*new_node = node;
970 	return ret;
971 }
972 
read_bitmap(struct exfat * exfat)973 static int read_bitmap(struct exfat *exfat)
974 {
975 	struct exfat_lookup_filter filter = {
976 		.in.type	= EXFAT_BITMAP,
977 		.in.dentry_count = 0,
978 		.in.filter	= NULL,
979 		.in.param	= NULL,
980 	};
981 	struct exfat_dentry *dentry;
982 	int retval;
983 
984 	retval = exfat_lookup_dentry_set(exfat, exfat->root, &filter);
985 	if (retval)
986 		return retval;
987 
988 	dentry = filter.out.dentry_set;
989 	exfat_debug("start cluster %#x, size %#" PRIx64 "\n",
990 			le32_to_cpu(dentry->bitmap_start_clu),
991 			le64_to_cpu(dentry->bitmap_size));
992 
993 	if (le64_to_cpu(dentry->bitmap_size) <
994 			DIV_ROUND_UP(exfat->clus_count, 8)) {
995 		exfat_err("invalid size of allocation bitmap. 0x%" PRIx64 "\n",
996 				le64_to_cpu(dentry->bitmap_size));
997 		retval = -EINVAL;
998 		goto out;
999 	}
1000 	if (!exfat_heap_clus(exfat, le32_to_cpu(dentry->bitmap_start_clu))) {
1001 		exfat_err("invalid start cluster of allocate bitmap. 0x%x\n",
1002 				le32_to_cpu(dentry->bitmap_start_clu));
1003 		retval = -EINVAL;
1004 		goto out;
1005 	}
1006 
1007 	exfat->disk_bitmap_clus = le32_to_cpu(dentry->bitmap_start_clu);
1008 	exfat->disk_bitmap_size = DIV_ROUND_UP(exfat->clus_count, 8);
1009 
1010 	exfat_bitmap_set_range(exfat, exfat->alloc_bitmap,
1011 			       le32_to_cpu(dentry->bitmap_start_clu),
1012 			       DIV_ROUND_UP(exfat->disk_bitmap_size,
1013 					    exfat->clus_size));
1014 	if (exfat_read(exfat->blk_dev->dev_fd, exfat->disk_bitmap,
1015 			exfat->disk_bitmap_size,
1016 			exfat_c2o(exfat, exfat->disk_bitmap_clus)) !=
1017 			(ssize_t)exfat->disk_bitmap_size)
1018 		retval = -EIO;
1019 out:
1020 	free(filter.out.dentry_set);
1021 	return retval;
1022 }
1023 
decompress_upcase_table(const __le16 * in_table,size_t in_len,__u16 * out_table,size_t out_len)1024 static int decompress_upcase_table(const __le16 *in_table, size_t in_len,
1025 				   __u16 *out_table, size_t out_len)
1026 {
1027 	size_t i, k;
1028 	uint16_t ch;
1029 
1030 	if (in_len > out_len)
1031 		return -E2BIG;
1032 
1033 	for (k = 0; k < out_len; k++)
1034 		out_table[k] = k;
1035 
1036 	for (i = 0, k = 0; i < in_len && k < out_len; i++) {
1037 		ch = le16_to_cpu(in_table[i]);
1038 
1039 		if (ch == 0xFFFF && i + 1 < in_len) {
1040 			++i;
1041 			k += le16_to_cpu(in_table[i]);
1042 		} else {
1043 			out_table[k++] = ch;
1044 		}
1045 	}
1046 	return 0;
1047 }
1048 
read_upcase_table(struct exfat * exfat)1049 static int read_upcase_table(struct exfat *exfat)
1050 {
1051 	struct exfat_lookup_filter filter = {
1052 		.in.type	= EXFAT_UPCASE,
1053 		.in.dentry_count = 0,
1054 		.in.filter	= NULL,
1055 		.in.param	= NULL,
1056 	};
1057 	struct exfat_dentry *dentry = NULL;
1058 	__le16 *upcase = NULL;
1059 	int retval;
1060 	ssize_t size;
1061 	__le32 checksum;
1062 
1063 	retval = exfat_lookup_dentry_set(exfat, exfat->root, &filter);
1064 	if (retval)
1065 		return retval;
1066 
1067 	dentry = filter.out.dentry_set;
1068 
1069 	if (!exfat_heap_clus(exfat, le32_to_cpu(dentry->upcase_start_clu))) {
1070 		exfat_err("invalid start cluster of upcase table. 0x%x\n",
1071 			le32_to_cpu(dentry->upcase_start_clu));
1072 		retval = -EINVAL;
1073 		goto out;
1074 	}
1075 
1076 	size = (ssize_t)le64_to_cpu(dentry->upcase_size);
1077 	if (size > (ssize_t)(EXFAT_MAX_UPCASE_CHARS * sizeof(__le16)) ||
1078 			size == 0 || size % sizeof(__le16)) {
1079 		exfat_err("invalid size of upcase table. 0x%" PRIx64 "\n",
1080 			le64_to_cpu(dentry->upcase_size));
1081 		retval = -EINVAL;
1082 		goto out;
1083 	}
1084 
1085 	upcase = malloc(size);
1086 	if (!upcase) {
1087 		exfat_err("failed to allocate upcase table\n");
1088 		retval = -ENOMEM;
1089 		goto out;
1090 	}
1091 
1092 	if (exfat_read(exfat->blk_dev->dev_fd, upcase, size,
1093 			exfat_c2o(exfat,
1094 			le32_to_cpu(dentry->upcase_start_clu))) != size) {
1095 		exfat_err("failed to read upcase table\n");
1096 		retval = -EIO;
1097 		goto out;
1098 	}
1099 
1100 	checksum = 0;
1101 	boot_calc_checksum((unsigned char *)upcase, size, false, &checksum);
1102 	if (le32_to_cpu(dentry->upcase_checksum) != checksum) {
1103 		exfat_err("corrupted upcase table %#x (expected: %#x)\n",
1104 			checksum, le32_to_cpu(dentry->upcase_checksum));
1105 		retval = -EINVAL;
1106 		goto out;
1107 	}
1108 
1109 	exfat_bitmap_set_range(exfat, exfat->alloc_bitmap,
1110 			       le32_to_cpu(dentry->upcase_start_clu),
1111 			       DIV_ROUND_UP(le64_to_cpu(dentry->upcase_size),
1112 					    exfat->clus_size));
1113 
1114 	exfat->upcase_table = calloc(EXFAT_UPCASE_TABLE_CHARS, sizeof(uint16_t));
1115 	if (!exfat->upcase_table) {
1116 		retval = -EIO;
1117 		goto out;
1118 	}
1119 
1120 	decompress_upcase_table(upcase, size / 2,
1121 				exfat->upcase_table, EXFAT_UPCASE_TABLE_CHARS);
1122 out:
1123 	if (dentry)
1124 		free(dentry);
1125 	if (upcase)
1126 		free(upcase);
1127 	return retval;
1128 }
1129 
read_children(struct exfat_fsck * fsck,struct exfat_inode * dir)1130 static int read_children(struct exfat_fsck *fsck, struct exfat_inode *dir)
1131 {
1132 	struct exfat *exfat = fsck->exfat;
1133 	struct exfat_inode *node = NULL;
1134 	struct exfat_dentry *dentry;
1135 	struct exfat_de_iter *de_iter;
1136 	int dentry_count;
1137 	int ret;
1138 
1139 	de_iter = &fsck->de_iter;
1140 	ret = exfat_de_iter_init(de_iter, exfat, dir, fsck->buffer_desc);
1141 	if (ret == EOF)
1142 		return 0;
1143 	else if (ret)
1144 		return ret;
1145 
1146 	de_iter->name_hash_bitmap = fsck->name_hash_bitmap;
1147 	memset(fsck->name_hash_bitmap, 0,
1148 			EXFAT_BITMAP_SIZE(EXFAT_MAX_HASH_COUNT));
1149 
1150 	while (1) {
1151 		ret = exfat_de_iter_get(de_iter, 0, &dentry);
1152 		if (ret == EOF) {
1153 			break;
1154 		} else if (ret) {
1155 			fsck_err(dir->parent, dir,
1156 				"failed to get a dentry. %d\n", ret);
1157 			goto err;
1158 		}
1159 
1160 		dentry_count = 1;
1161 
1162 		switch (dentry->type) {
1163 		case EXFAT_FILE:
1164 			ret = read_file(de_iter, &node, &dentry_count);
1165 			if (ret < 0) {
1166 				exfat_stat.error_count++;
1167 				break;
1168 			} else if (ret) {
1169 				exfat_stat.error_count++;
1170 				exfat_stat.fixed_count++;
1171 			}
1172 
1173 			if (node) {
1174 				if ((node->attr & ATTR_SUBDIR) && node->size) {
1175 					node->parent = dir;
1176 					list_add_tail(&node->sibling,
1177 						      &dir->children);
1178 					list_add_tail(&node->list,
1179 						      &exfat->dir_list);
1180 				} else {
1181 					exfat_free_inode(node);
1182 				}
1183 			}
1184 			break;
1185 		case EXFAT_LAST:
1186 			goto out;
1187 		case EXFAT_VOLUME:
1188 		case EXFAT_BITMAP:
1189 		case EXFAT_UPCASE:
1190 		case EXFAT_GUID:
1191 			if (dir == exfat->root)
1192 				break;
1193 			/* fallthrough */
1194 		default:
1195 			if (IS_EXFAT_DELETED(dentry->type))
1196 				break;
1197 			if (repair_file_ask(de_iter, NULL, ER_DE_UNKNOWN,
1198 					    "unknown entry type %#x", dentry->type)) {
1199 				struct exfat_dentry *dentry;
1200 
1201 				exfat_de_iter_get_dirty(de_iter, 0, &dentry);
1202 				dentry->type &= EXFAT_DELETE;
1203 			}
1204 			break;
1205 		}
1206 
1207 		exfat_de_iter_advance(de_iter, dentry_count);
1208 	}
1209 out:
1210 	exfat_de_iter_flush(de_iter);
1211 	return 0;
1212 err:
1213 	exfat_free_children(dir, false);
1214 	INIT_LIST_HEAD(&dir->children);
1215 	exfat_de_iter_flush(de_iter);
1216 	return ret;
1217 }
1218 
1219 /* write bitmap segments for clusters which are marked
1220  * as free, but allocated to files.
1221  */
write_bitmap(struct exfat_fsck * fsck)1222 static int write_bitmap(struct exfat_fsck *fsck)
1223 {
1224 	struct exfat *exfat = fsck->exfat;
1225 	bitmap_t *disk_b, *alloc_b, *ohead_b;
1226 	off_t dev_offset;
1227 	unsigned int i, bitmap_bytes, byte_offset, write_bytes;
1228 
1229 	dev_offset = exfat_c2o(exfat, exfat->disk_bitmap_clus);
1230 	bitmap_bytes = EXFAT_BITMAP_SIZE(le32_to_cpu(exfat->bs->bsx.clu_count));
1231 
1232 	disk_b = (bitmap_t *)exfat->disk_bitmap;
1233 	alloc_b = (bitmap_t *)exfat->alloc_bitmap;
1234 	ohead_b = (bitmap_t *)exfat->ohead_bitmap;
1235 
1236 	for (i = 0; i < bitmap_bytes / sizeof(bitmap_t); i++)
1237 		ohead_b[i] = alloc_b[i] | disk_b[i];
1238 
1239 	i = 0;
1240 	while (i < bitmap_bytes / sizeof(bitmap_t)) {
1241 		if (ohead_b[i] == disk_b[i]) {
1242 			i++;
1243 			continue;
1244 		}
1245 
1246 		byte_offset = ((i * sizeof(bitmap_t)) / 512) * 512;
1247 		write_bytes = MIN(512, bitmap_bytes - byte_offset);
1248 
1249 		if (exfat_write(exfat->blk_dev->dev_fd,
1250 				(char *)ohead_b + byte_offset, write_bytes,
1251 				dev_offset + byte_offset) != (ssize_t)write_bytes)
1252 			return -EIO;
1253 
1254 		i = (byte_offset + write_bytes) / sizeof(bitmap_t);
1255 	}
1256 	return 0;
1257 
1258 }
1259 
1260 /*
1261  * for each directory in @dir_list.
1262  * 1. read all dentries and allocate exfat_nodes for files and directories.
1263  *    and append directory exfat_nodes to the head of @dir_list
1264  * 2. free all of file exfat_nodes.
1265  * 3. if the directory does not have children, free its exfat_node.
1266  */
exfat_filesystem_check(struct exfat_fsck * fsck)1267 static int exfat_filesystem_check(struct exfat_fsck *fsck)
1268 {
1269 	struct exfat *exfat = fsck->exfat;
1270 	struct exfat_inode *dir;
1271 	int ret = 0, dir_errors;
1272 
1273 	if (!exfat->root) {
1274 		exfat_err("root is NULL\n");
1275 		return -ENOENT;
1276 	}
1277 
1278 	fsck->name_hash_bitmap = malloc(EXFAT_BITMAP_SIZE(EXFAT_MAX_HASH_COUNT));
1279 	if (!fsck->name_hash_bitmap) {
1280 		exfat_err("failed to allocate name hash bitmap\n");
1281 		return -ENOMEM;
1282 	}
1283 
1284 	list_add(&exfat->root->list, &exfat->dir_list);
1285 
1286 	while (!list_empty(&exfat->dir_list)) {
1287 		dir = list_entry(exfat->dir_list.next,
1288 				 struct exfat_inode, list);
1289 
1290 		if (!(dir->attr & ATTR_SUBDIR)) {
1291 			fsck_err(dir->parent, dir,
1292 				"failed to travel directories. "
1293 				"the node is not directory\n");
1294 			ret = -EINVAL;
1295 			goto out;
1296 		}
1297 
1298 		dir_errors = read_children(fsck, dir);
1299 		if (dir_errors) {
1300 			exfat_resolve_path(&path_resolve_ctx, dir);
1301 			exfat_debug("failed to check dentries: %s\n",
1302 					path_resolve_ctx.local_path);
1303 			ret = dir_errors;
1304 		}
1305 
1306 		list_del(&dir->list);
1307 		exfat_free_file_children(dir);
1308 		exfat_free_ancestors(dir);
1309 	}
1310 out:
1311 	exfat_free_dir_list(exfat);
1312 	free(fsck->name_hash_bitmap);
1313 	return ret;
1314 }
1315 
exfat_root_dir_check(struct exfat * exfat)1316 static int exfat_root_dir_check(struct exfat *exfat)
1317 {
1318 	struct exfat_inode *root;
1319 	clus_t clus_count = 0;
1320 	int err;
1321 
1322 	root = exfat_alloc_inode(ATTR_SUBDIR);
1323 	if (!root)
1324 		return -ENOMEM;
1325 
1326 	exfat->root = root;
1327 	root->first_clus = le32_to_cpu(exfat->bs->bsx.root_cluster);
1328 	if (root_check_clus_chain(exfat, root, &clus_count)) {
1329 		exfat_err("failed to follow the cluster chain of root\n");
1330 		exfat_free_inode(root);
1331 		exfat->root = NULL;
1332 		return -EINVAL;
1333 	}
1334 	root->size = clus_count * exfat->clus_size;
1335 
1336 	exfat_stat.dir_count++;
1337 	exfat_debug("root directory: start cluster[0x%x] size[0x%" PRIx64 "]\n",
1338 		root->first_clus, root->size);
1339 
1340 	err = exfat_read_volume_label(exfat);
1341 	if (err && err != EOF)
1342 		exfat_err("failed to read volume label\n");
1343 
1344 	err = read_bitmap(exfat);
1345 	if (err) {
1346 		exfat_err("failed to read bitmap\n");
1347 		return -EINVAL;
1348 	}
1349 
1350 	err = read_upcase_table(exfat);
1351 	if (err) {
1352 		exfat_err("failed to read upcase table\n");
1353 		return -EINVAL;
1354 	}
1355 
1356 	root->dev_offset = 0;
1357 	err = exfat_build_file_dentry_set(exfat, " ", ATTR_SUBDIR,
1358 					  &root->dentry_set, &root->dentry_count);
1359 	if (err) {
1360 		exfat_free_inode(root);
1361 		return -ENOMEM;
1362 	}
1363 	return 0;
1364 }
1365 
read_lostfound(struct exfat * exfat,struct exfat_inode ** lostfound)1366 static int read_lostfound(struct exfat *exfat, struct exfat_inode **lostfound)
1367 {
1368 	struct exfat_lookup_filter filter;
1369 	struct exfat_inode *inode;
1370 	int err;
1371 
1372 	err = exfat_lookup_file(exfat, exfat->root, "LOST+FOUND", &filter);
1373 	if (err)
1374 		return err;
1375 
1376 	inode = exfat_alloc_inode(ATTR_SUBDIR);
1377 	if (!inode) {
1378 		free(filter.out.dentry_set);
1379 		return -ENOMEM;
1380 	}
1381 
1382 	inode->dentry_set = filter.out.dentry_set;
1383 	inode->dentry_count = filter.out.dentry_count;
1384 	inode->dev_offset = filter.out.dev_offset;
1385 
1386 	inode->first_clus =
1387 		le32_to_cpu(filter.out.dentry_set[1].dentry.stream.start_clu);
1388 	inode->size =
1389 		le64_to_cpu(filter.out.dentry_set[1].dentry.stream.size);
1390 
1391 	*lostfound = inode;
1392 	return 0;
1393 }
1394 
1395 /* Create temporary files under LOST+FOUND and assign orphan
1396  * chains of clusters to these files.
1397  */
rescue_orphan_clusters(struct exfat_fsck * fsck)1398 static int rescue_orphan_clusters(struct exfat_fsck *fsck)
1399 {
1400 	struct exfat *exfat = fsck->exfat;
1401 	struct exfat_inode *lostfound;
1402 	bitmap_t *disk_b, *alloc_b, *ohead_b;
1403 	struct exfat_dentry *dset;
1404 	clus_t clu_count, clu, s_clu, e_clu;
1405 	int err, dcount;
1406 	unsigned int i;
1407 	char name[] = "FILE0000000.CHK";
1408 	struct exfat_dentry_loc loc;
1409 	struct exfat_lookup_filter lf = {
1410 		.in.type = EXFAT_INVAL,
1411 		.in.dentry_count = 0,
1412 		.in.filter = NULL,
1413 	};
1414 
1415 	clu_count = le32_to_cpu(exfat->bs->bsx.clu_count);
1416 
1417 	/* find clusters which are not marked as free, but not allocated to
1418 	 * any files.
1419 	 */
1420 	disk_b = (bitmap_t *)exfat->disk_bitmap;
1421 	alloc_b = (bitmap_t *)exfat->alloc_bitmap;
1422 	ohead_b = (bitmap_t *)exfat->ohead_bitmap;
1423 	for (i = 0; i < EXFAT_BITMAP_SIZE(clu_count) / sizeof(bitmap_t); i++)
1424 		ohead_b[i] = disk_b[i] & ~alloc_b[i];
1425 
1426 	/* no orphan clusters */
1427 	if (exfat_bitmap_find_one(exfat, exfat->ohead_bitmap,
1428 				EXFAT_FIRST_CLUSTER, &s_clu))
1429 		return 0;
1430 
1431 	err = exfat_create_file(exfat_fsck.exfat,
1432 				exfat_fsck.exfat->root,
1433 				"LOST+FOUND",
1434 				ATTR_SUBDIR);
1435 	if (err) {
1436 		exfat_err("failed to create LOST+FOUND directory\n");
1437 		return err;
1438 	}
1439 
1440 	if (fsync(exfat_fsck.exfat->blk_dev->dev_fd) != 0) {
1441 		exfat_err("failed to sync()\n");
1442 		return -EIO;
1443 	}
1444 
1445 	err = read_lostfound(exfat, &lostfound);
1446 	if (err) {
1447 		exfat_err("failed to find LOST+FOUND\n");
1448 		return err;
1449 	}
1450 
1451 	/* get the last empty region of LOST+FOUND */
1452 	err = exfat_lookup_dentry_set(exfat, lostfound, &lf);
1453 	if (err && err != EOF) {
1454 		exfat_err("failed to find the last empty slot in LOST+FOUND\n");
1455 		goto out;
1456 	}
1457 
1458 	loc.parent = lostfound;
1459 	loc.file_offset = lf.out.file_offset;
1460 	loc.dev_offset = lf.out.dev_offset;
1461 
1462 	/* build a template dentry set */
1463 	err = exfat_build_file_dentry_set(exfat, name, 0, &dset, &dcount);
1464 	if (err) {
1465 		exfat_err("failed to create a temporary file in LOST+FOUNDn");
1466 		goto out;
1467 	}
1468 	dset[1].dentry.stream.flags |= EXFAT_SF_CONTIGUOUS;
1469 
1470 	/* create temporary files and allocate contiguous orphan clusters
1471 	 * to each file.
1472 	 */
1473 	for (clu = EXFAT_FIRST_CLUSTER; clu < clu_count + EXFAT_FIRST_CLUSTER &&
1474 	     exfat_bitmap_find_one(exfat, exfat->ohead_bitmap, clu, &s_clu) == 0;) {
1475 		if (exfat_bitmap_find_zero(exfat, exfat->ohead_bitmap, s_clu, &e_clu))
1476 			e_clu = clu_count + EXFAT_FIRST_CLUSTER;
1477 		clu = e_clu;
1478 
1479 		snprintf(name, sizeof(name), "FILE%07d.CHK",
1480 			 (unsigned int)(loc.file_offset >> 5));
1481 		err = exfat_update_file_dentry_set(exfat, dset, dcount,
1482 						   name, s_clu, e_clu - s_clu);
1483 		if (err)
1484 			continue;
1485 		err = exfat_add_dentry_set(exfat, &loc, dset, dcount, true);
1486 		if (err)
1487 			continue;
1488 	}
1489 
1490 	free(dset);
1491 	err = 0;
1492 out:
1493 	exfat_free_inode(lostfound);
1494 	return err;
1495 }
1496 
bytes_to_human_readable(size_t bytes)1497 static char *bytes_to_human_readable(size_t bytes)
1498 {
1499 	static const char * const units[] = {"B", "KB", "MB", "GB", "TB", "PB"};
1500 	static char buf[15*4];
1501 	unsigned int i, shift, quoti, remain;
1502 	i = sizeof(units) / sizeof(units[0]) - 1;
1503 
1504 	while (i && (bytes >> i * 10) == 0)
1505 		i--;
1506 
1507 	shift = i * 10;
1508 	quoti = (unsigned int)(bytes / (1ULL << shift));
1509 	remain = 0;
1510 	if (shift > 0) {
1511 		remain = (unsigned int)
1512 			((bytes & ((1ULL << shift) - 1)) >> (shift - 10));
1513 		remain = (remain * 100) / 1024;
1514 	}
1515 
1516 	snprintf(buf, sizeof(buf), "%u.%02u %s", quoti, remain, units[i]);
1517 	return buf;
1518 }
1519 
exfat_show_info(struct exfat_fsck * fsck,const char * dev_name)1520 static void exfat_show_info(struct exfat_fsck *fsck, const char *dev_name)
1521 {
1522 	struct exfat *exfat = fsck->exfat;
1523 	bool clean;
1524 
1525 	exfat_info("sector size:  %s\n",
1526 		bytes_to_human_readable(1 << exfat->bs->bsx.sect_size_bits));
1527 	exfat_info("cluster size: %s\n",
1528 		bytes_to_human_readable(exfat->clus_size));
1529 	exfat_info("volume size:  %s\n",
1530 		bytes_to_human_readable(exfat->blk_dev->size));
1531 
1532 	clean = exfat_stat.error_count == 0 ||
1533 		exfat_stat.error_count == exfat_stat.fixed_count;
1534 	printf("%s: %s. directories %ld, files %ld\n", dev_name,
1535 			clean ? "clean" : "corrupted",
1536 			exfat_stat.dir_count, exfat_stat.file_count);
1537 	if (exfat_stat.error_count)
1538 		printf("%s: files corrupted %ld, files fixed %ld\n", dev_name,
1539 			exfat_stat.error_count - exfat_stat.fixed_count,
1540 			exfat_stat.fixed_count);
1541 }
1542 
main(int argc,char * const argv[])1543 int main(int argc, char * const argv[])
1544 {
1545 	struct fsck_user_input ui;
1546 	struct exfat_blk_dev bd;
1547 	struct pbr *bs = NULL;
1548 	int c, ret, exit_code;
1549 	bool version_only = false;
1550 
1551 	memset(&ui, 0, sizeof(ui));
1552 	memset(&bd, 0, sizeof(bd));
1553 
1554 	print_level = EXFAT_ERROR;
1555 
1556 	if (!setlocale(LC_CTYPE, ""))
1557 		exfat_err("failed to init locale/codeset\n");
1558 
1559 	opterr = 0;
1560 	while ((c = getopt_long(argc, argv, "arynpbsVvh", opts, NULL)) != EOF) {
1561 		switch (c) {
1562 		case 'n':
1563 			if (ui.options & FSCK_OPTS_REPAIR_ALL)
1564 				usage(argv[0]);
1565 			ui.options |= FSCK_OPTS_REPAIR_NO;
1566 			break;
1567 		case 'r':
1568 			if (ui.options & FSCK_OPTS_REPAIR_ALL)
1569 				usage(argv[0]);
1570 			ui.options |= FSCK_OPTS_REPAIR_ASK;
1571 			break;
1572 		case 'y':
1573 			if (ui.options & FSCK_OPTS_REPAIR_ALL)
1574 				usage(argv[0]);
1575 			ui.options |= FSCK_OPTS_REPAIR_YES;
1576 			break;
1577 		case 'a':
1578 		case 'p':
1579 			if (ui.options & FSCK_OPTS_REPAIR_ALL)
1580 				usage(argv[0]);
1581 			ui.options |= FSCK_OPTS_REPAIR_AUTO;
1582 			break;
1583 		case 'b':
1584 			ui.options |= FSCK_OPTS_IGNORE_BAD_FS_NAME;
1585 			break;
1586 		case 's':
1587 			ui.options |= FSCK_OPTS_RESCUE_CLUS;
1588 			break;
1589 		case 'V':
1590 			version_only = true;
1591 			break;
1592 		case 'v':
1593 			if (print_level < EXFAT_DEBUG)
1594 				print_level++;
1595 			break;
1596 		case '?':
1597 		case 'h':
1598 		default:
1599 			usage(argv[0]);
1600 		}
1601 	}
1602 
1603 	show_version();
1604 	if (optind != argc - 1)
1605 		usage(argv[0]);
1606 
1607 	if (version_only)
1608 		exit(FSCK_EXIT_SYNTAX_ERROR);
1609 	if (ui.options & FSCK_OPTS_REPAIR_WRITE)
1610 		ui.ei.writeable = true;
1611 	else {
1612 		if (ui.options & (FSCK_OPTS_IGNORE_BAD_FS_NAME |
1613 				  FSCK_OPTS_RESCUE_CLUS))
1614 			usage(argv[0]);
1615 		ui.options |= FSCK_OPTS_REPAIR_NO;
1616 		ui.ei.writeable = false;
1617 	}
1618 
1619 	exfat_fsck.options = ui.options;
1620 
1621 	ui.ei.dev_name = argv[optind];
1622 	ret = exfat_get_blk_dev_info(&ui.ei, &bd);
1623 	if (ret < 0) {
1624 		exfat_err("failed to open %s. %d\n", ui.ei.dev_name, ret);
1625 		return FSCK_EXIT_OPERATION_ERROR;
1626 	}
1627 
1628 	ret = exfat_boot_region_check(&bd, &bs,
1629 				      ui.options & FSCK_OPTS_IGNORE_BAD_FS_NAME ?
1630 				      true : false);
1631 	if (ret)
1632 		goto err;
1633 
1634 	exfat_fsck.exfat = exfat_alloc_exfat(&bd, bs);
1635 	if (!exfat_fsck.exfat) {
1636 		ret = -ENOMEM;
1637 		goto err;
1638 	}
1639 
1640 	exfat_fsck.buffer_desc = exfat_alloc_buffer(exfat_fsck.exfat);
1641 	if (!exfat_fsck.buffer_desc) {
1642 		ret = -ENOMEM;
1643 		goto err;
1644 	}
1645 
1646 	if ((exfat_fsck.options & FSCK_OPTS_REPAIR_WRITE) &&
1647 	    exfat_mark_volume_dirty(exfat_fsck.exfat, true)) {
1648 		ret = -EIO;
1649 		goto err;
1650 	}
1651 
1652 	exfat_debug("verifying root directory...\n");
1653 	ret = exfat_root_dir_check(exfat_fsck.exfat);
1654 	if (ret) {
1655 		exfat_err("failed to verify root directory.\n");
1656 		goto out;
1657 	}
1658 
1659 	exfat_debug("verifying directory entries...\n");
1660 	ret = exfat_filesystem_check(&exfat_fsck);
1661 	if (ret)
1662 		goto out;
1663 
1664 	if (exfat_fsck.options & FSCK_OPTS_RESCUE_CLUS) {
1665 		rescue_orphan_clusters(&exfat_fsck);
1666 		exfat_fsck.dirty = true;
1667 		exfat_fsck.dirty_fat = true;
1668 	}
1669 
1670 	if (exfat_fsck.options & FSCK_OPTS_REPAIR_WRITE) {
1671 		ret = write_bitmap(&exfat_fsck);
1672 		if (ret) {
1673 			exfat_err("failed to write bitmap\n");
1674 			goto out;
1675 		}
1676 	}
1677 
1678 	if (ui.ei.writeable && fsync(bd.dev_fd)) {
1679 		exfat_err("failed to sync\n");
1680 		ret = -EIO;
1681 		goto out;
1682 	}
1683 	if (exfat_fsck.options & FSCK_OPTS_REPAIR_WRITE)
1684 		exfat_mark_volume_dirty(exfat_fsck.exfat, false);
1685 
1686 out:
1687 	exfat_show_info(&exfat_fsck, ui.ei.dev_name);
1688 err:
1689 	if (ret && ret != -EINVAL)
1690 		exit_code = FSCK_EXIT_OPERATION_ERROR;
1691 	else if (ret == -EINVAL ||
1692 		 exfat_stat.error_count != exfat_stat.fixed_count)
1693 		exit_code = FSCK_EXIT_ERRORS_LEFT;
1694 	else if (exfat_fsck.dirty)
1695 		exit_code = FSCK_EXIT_CORRECTED;
1696 	else
1697 		exit_code = FSCK_EXIT_NO_ERRORS;
1698 
1699 	if (exfat_fsck.buffer_desc)
1700 		exfat_free_buffer(exfat_fsck.exfat, exfat_fsck.buffer_desc);
1701 	if (exfat_fsck.exfat)
1702 		exfat_free_exfat(exfat_fsck.exfat);
1703 	close(bd.dev_fd);
1704 	return exit_code;
1705 }
1706