OSDN Git Service

Repairing: implement unknown entry type fix.
authorrelan <relan@users.noreply.github.com>
Thu, 23 Mar 2017 05:34:21 +0000 (08:34 +0300)
committerrelan <relan@users.noreply.github.com>
Sat, 15 Sep 2018 04:52:46 +0000 (07:52 +0300)
libexfat/exfat.h
libexfat/node.c
libexfat/repair.c

index 00c903d..2342be4 100644 (file)
@@ -238,5 +238,7 @@ bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector,
                uint32_t vbr_checksum);
 bool exfat_fix_invalid_node_checksum(const struct exfat* ef,
                struct exfat_node* node);
                uint32_t vbr_checksum);
 bool exfat_fix_invalid_node_checksum(const struct exfat* ef,
                struct exfat_node* node);
+bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir,
+               const struct exfat_entry* entry, off_t offset);
 
 #endif /* ifndef EXFAT_H_INCLUDED */
 
 #endif /* ifndef EXFAT_H_INCLUDED */
index 9270ccf..ab1d7d6 100644 (file)
@@ -517,7 +517,8 @@ static int readdir(struct exfat* ef, struct exfat_node* parent,
                                break; /* deleted entry, ignore it */
 
                        exfat_error("unknown entry type %#hhx", entry.type);
                                break; /* deleted entry, ignore it */
 
                        exfat_error("unknown entry type %#hhx", entry.type);
-                       return -EIO;
+                       if (!EXFAT_REPAIR(unknown_entry, ef, parent, &entry, *offset))
+                               return -EIO;
                }
                *offset += sizeof(entry);
        }
                }
                *offset += sizeof(entry);
        }
index 049ebd7..237ab3a 100644 (file)
@@ -86,3 +86,17 @@ bool exfat_fix_invalid_node_checksum(const struct exfat* ef,
        exfat_errors_fixed++;
        return true;
 }
        exfat_errors_fixed++;
        return true;
 }
+
+bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir,
+               const struct exfat_entry* entry, off_t offset)
+{
+       struct exfat_entry deleted = *entry;
+
+       deleted.type &= ~EXFAT_ENTRY_VALID;
+       if (exfat_generic_pwrite(ef, dir, &deleted, sizeof(struct exfat_entry),
+                       offset) != sizeof(struct exfat_entry))
+               return false;
+
+       exfat_errors_fixed++;
+       return true;
+}