summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2021-11-05 01:26:43 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-11-05 01:26:43 +0000
commitd0bbf5abf8b1b692b15eda088eb77f31ab2b0f65 (patch)
tree74b106e081ec97afca7cc2b7caa5992227b9c12b
parentc5147bee1c421890bd0d7903dce24b516d381025 (diff)
parentab03d40eaeaf6d4f19d963d4d006744bbafb3d81 (diff)
downloadfsck_msdos-d0bbf5abf8b1b692b15eda088eb77f31ab2b0f65.tar.gz
Merge "fsck_msdosfs: truncate directory entry when the head pointer is invalid." am: 023cbbf051 am: ab03d40eae
Original change: https://android-review.googlesource.com/c/platform/external/fsck_msdos/+/1881794 Change-Id: If6bf1a92e2dc66d93a8c67245052ca9096bc274e
-rw-r--r--dir.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/dir.c b/dir.c
index 010bd65..dbe4e0c 100644
--- a/dir.c
+++ b/dir.c
@@ -400,8 +400,21 @@ checksize(struct fat_descriptor *fat, u_char *p, struct dosDirEntry *dir)
if (dir->head == CLUST_FREE) {
physicalSize = 0;
} else {
- if (!fat_is_valid_cl(fat, dir->head))
- return FSERROR;
+ if (!fat_is_valid_cl(fat, dir->head) || !fat_is_cl_head(fat, dir->head)) {
+ pwarn("Directory entry %s of size %u referencing invalid cluster %u\n",
+ fullpath(dir), dir->size, dir->head);
+ if (ask(1, "Truncate")) {
+ p[28] = p[29] = p[30] = p[31] = 0;
+ p[26] = p[27] = 0;
+ if (boot->ClustMask == CLUST32_MASK)
+ p[20] = p[21] = 0;
+ dir->size = 0;
+ dir->head = CLUST_FREE;
+ return FSDIRMOD;
+ } else {
+ return FSERROR;
+ }
+ }
ret = checkchain(fat, dir->head, &chainsize);
/*
* Upon return, chainsize would hold the chain length
@@ -422,8 +435,8 @@ checksize(struct fat_descriptor *fat, u_char *p, struct dosDirEntry *dir)
physicalSize = (u_int64_t)chainsize * boot->ClusterSize;
}
if (physicalSize < dir->size) {
- pwarn("size of %s is %u, should at most be %" PRIu64 "\n",
- fullpath(dir), dir->size, physicalSize);
+ pwarn("size of %s is %u, should at most be %ju\n",
+ fullpath(dir), dir->size, (uintmax_t)physicalSize);
if (ask(1, "Truncate")) {
dir->size = physicalSize;
p[28] = (u_char)physicalSize;