Page MenuHomeFreeBSD

Tighten FAT checks and fix off-by-one error in corner case.
ClosedPublic

Authored by delphij on Jan 7 2020, 5:32 AM.

Details

Summary

Tighten FAT checks and fix off-by-one error in corner case.

fat.c:

  • readfat:
    1. Only truncate out-of-range cluster pointers (1, or greater than NumClusters but smaller than CLUST_RSRVD), as the current cluster may contain some data. We can't fix reserved cluster pointers at this pass, because we do no know the potential cluster preceding it.
    2. Accept valid cluster for head bitmap. This is a no-op, and mainly to improve code readability, because the 1 is already handled in the previous else if block.
  • truncate_at: absorbed into checkchain.
  • checkchain: save the previous node we have traversed in case that we have a chain that ends with a special (>= CLUST_RSRVD) cluster, or is free. In these cases, we need to truncate at the cluster preceeding the current cluster, as the current cluster contains a marker instead of a next pointer and can not be changed to CLUST_EOF (the else case can happen if the user answered "no" at some point in readfat()).
  • clearchain: correct the iterator for next cluster so that we dont stop after clearing the first cluster.
  • checklost: If checkchain() thinks the chain have no cluster, it doesn't make sense to reconnect it, so don't bother asking.
Test Plan

Test with various disk images with abnormal chain planted

Diff Detail

Repository
rS FreeBSD src repository
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

delphij created this revision.Jan 7 2020, 5:32 AM
kevlo accepted this revision.Jan 12 2020, 6:05 AM
This revision is now accepted and ready to land.Jan 12 2020, 6:05 AM
This revision was automatically updated to reflect the committed changes.