Не боги горшки обжигают
От: MShura  
Дата: 12.03.08 22:39
Оценка: 23 (5)
Нашел интересную багу в fastfat.
Файл allocsup.c
Функция FatSetupAllocationSupport
Фрагмент
...
Vcb->AllocationSupport.NumberOfClusters = FatNumberOfClusters( &Vcb->Bpb );
...
ClustersDescribableByFat = ( ((FatIsFat32(Vcb)? Vcb->Bpb.LargeSectorsPerFat :
                                                    Vcb->Bpb.SectorsPerFat) *
                                  Vcb->Bpb.BytesPerSector * 8)
                                 / FatIndexBitSize(&Vcb->Bpb) ) - 2;

if (Vcb->AllocationSupport.NumberOfClusters > ClustersDescribableByFat) {

   Vcb->AllocationSupport.NumberOfClusters = ClustersDescribableByFat;
}


Видите ошибку?
А если так (FAT32):

ClustersDescribableByFat = (( LargeSectorsPerFat * 512 * 8) / 32 ) - 2;


Поскольку все переменные 32-х битные, то легко достигается переполнение при больших числах.
По спецификации максимальное количество кластеров на FAT32 равно 0x0FFFFFF6
Вышеприведенная формула выдаст в лучшем случае (LargeSectorsPerFat = 0xfffff) 0x07FFFF80

В итоге Vcb->AllocationSupport.NumberOfClusters, а вместе с ней и размер возвращаемый GetDiskFreeSpaceEx станут неверными
Чтобы воспроизвести отформатируйте том более 64Гб под FAT32 с кластером 512 байт.
К сожалению придётся воспользоваться сторонними утилитами.
Re: Не боги горшки обжигают
От: Аноним  
Дата: 18.03.08 10:15
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Нашел интересную багу в fastfat.


MS>...


Вот я находил другую проблему в Майкрософтовской реализации FAT, интересно удастся ли Вам найти её место в исходниках.

Структура FSINFO используется для хранение информации о свободном месте и хранении "хинта", содрежащего номер первого свободного кластера. Так вот, замечено, что только младшие два байта сохраняются, т.е. если записать на FAT диск файлы, чтобы первый свободный был 0x123456, в FSINFO будет 0x003456.
Re[2]: Не боги горшки обжигают
От: MShura  
Дата: 18.03.08 10:54
Оценка:
А>Вот я находил другую проблему в Майкрософтовской реализации FAT, интересно удастся ли Вам найти её место в исходниках.

А>Структура FSINFO используется для хранение информации о свободном месте и хранении "хинта", содрежащего номер первого свободного кластера. Так вот, замечено, что только младшие два байта сохраняются, т.е. если записать на FAT диск файлы, чтобы первый свободный был 0x123456, в FSINFO будет 0x003456.


Для быстрого выделения кластеров используется возможности bitmap.
Причем если количество кластеров на FAT меньше 0x10000, то битмапом покрывают весь FAT, если больше (почти любые FAT32), то используют "окошечный" вариант bitmap, в одном окошке 0x10000 кластеров.
Свободный кластер в FSINFO — суть номер кластера в текущем окошке.
Конечно бага, но не серьезная, поскольку это только hint и лучше не доверять ему из-за огромного количества third party утилит, которые модифицируют FAT.
Re[3]: Не боги горшки обжигают
От: Аноним  
Дата: 18.03.08 11:07
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Для быстрого выделения кластеров используется возможности bitmap.

MS>Причем если количество кластеров на FAT меньше 0x10000, то битмапом покрывают весь FAT, если больше (почти любые FAT32), то используют "окошечный" вариант bitmap, в одном окошке 0x10000 кластеров.
MS>Свободный кластер в FSINFO — суть номер кластера в текущем окошке.
MS>Конечно бага, но не серьезная, поскольку это только hint и лучше не доверять ему из-за огромного количества third party утилит, которые модифицируют FAT.

Понял, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.