1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 01:03:09 +00:00

Check tablebase files

This addresses partially issue #1911 in that it documents in our
Readme the command that users can use to verifying the md5sum of
their downloaded tablebase files.

Additionally, a quick check of the file size (the size of each
tablebase file modulo 64 is 16 as pointed out by @syzygy1) has been
implemented at launch time in Stockfish.

Closes https://github.com/official-stockfish/Stockfish/pull/1927
and https://github.com/official-stockfish/Stockfish/issues/1911

No functional change.
This commit is contained in:
Joost VandeVondele 2019-01-03 23:56:11 +01:00 committed by Stéphane Nicolet
parent 3c576efa77
commit bb843a00c1
2 changed files with 29 additions and 9 deletions

View file

@ -86,7 +86,9 @@ Currently, Stockfish has the following UCI options:
Example: `C:\tablebases\wdl345;C:\tablebases\wdl6;D:\tablebases\dtz345;D:\tablebases\dtz6` Example: `C:\tablebases\wdl345;C:\tablebases\wdl6;D:\tablebases\dtz345;D:\tablebases\dtz6`
It is recommended to store .rtbw files on an SSD. There is no loss in storing It is recommended to store .rtbw files on an SSD. There is no loss in storing
the .rtbz files on a regular HD. the .rtbz files on a regular HD. It is recommended to verify all md5 checksums
of the downloaded tablebase files (`md5sum -c checksum.md5`) as corruption will
lead to engine crashes.
* #### SyzygyProbeDepth * #### SyzygyProbeDepth
Minimum remaining search depth for which a position is probed. Set this option Minimum remaining search depth for which a position is probed. Set this option

View file

@ -214,14 +214,22 @@ public:
return *baseAddress = nullptr, nullptr; return *baseAddress = nullptr, nullptr;
fstat(fd, &statbuf); fstat(fd, &statbuf);
if (statbuf.st_size % 64 != 16)
{
std::cerr << "Corrupt tablebase file " << fname << std::endl;
exit(EXIT_FAILURE);
}
*mapping = statbuf.st_size; *mapping = statbuf.st_size;
*baseAddress = mmap(nullptr, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); *baseAddress = mmap(nullptr, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
madvise(*baseAddress, statbuf.st_size, MADV_RANDOM); madvise(*baseAddress, statbuf.st_size, MADV_RANDOM);
::close(fd); ::close(fd);
if (*baseAddress == MAP_FAILED) { if (*baseAddress == MAP_FAILED)
{
std::cerr << "Could not mmap() " << fname << std::endl; std::cerr << "Could not mmap() " << fname << std::endl;
exit(1); exit(EXIT_FAILURE);
} }
#else #else
// Note FILE_FLAG_RANDOM_ACCESS is only a hint to Windows and as such may get ignored. // Note FILE_FLAG_RANDOM_ACCESS is only a hint to Windows and as such may get ignored.
@ -233,21 +241,30 @@ public:
DWORD size_high; DWORD size_high;
DWORD size_low = GetFileSize(fd, &size_high); DWORD size_low = GetFileSize(fd, &size_high);
if (size_low % 64 != 16)
{
std::cerr << "Corrupt tablebase file " << fname << std::endl;
exit(EXIT_FAILURE);
}
HANDLE mmap = CreateFileMapping(fd, nullptr, PAGE_READONLY, size_high, size_low, nullptr); HANDLE mmap = CreateFileMapping(fd, nullptr, PAGE_READONLY, size_high, size_low, nullptr);
CloseHandle(fd); CloseHandle(fd);
if (!mmap) { if (!mmap)
{
std::cerr << "CreateFileMapping() failed" << std::endl; std::cerr << "CreateFileMapping() failed" << std::endl;
exit(1); exit(EXIT_FAILURE);
} }
*mapping = (uint64_t)mmap; *mapping = (uint64_t)mmap;
*baseAddress = MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0); *baseAddress = MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0);
if (!*baseAddress) { if (!*baseAddress)
{
std::cerr << "MapViewOfFile() failed, name = " << fname std::cerr << "MapViewOfFile() failed, name = " << fname
<< ", error = " << GetLastError() << std::endl; << ", error = " << GetLastError() << std::endl;
exit(1); exit(EXIT_FAILURE);
} }
#endif #endif
uint8_t* data = (uint8_t*)*baseAddress; uint8_t* data = (uint8_t*)*baseAddress;
@ -255,7 +272,8 @@ public:
constexpr uint8_t Magics[][4] = { { 0xD7, 0x66, 0x0C, 0xA5 }, constexpr uint8_t Magics[][4] = { { 0xD7, 0x66, 0x0C, 0xA5 },
{ 0x71, 0xE8, 0x23, 0x5D } }; { 0x71, 0xE8, 0x23, 0x5D } };
if (memcmp(data, Magics[type == WDL], 4)) { if (memcmp(data, Magics[type == WDL], 4))
{
std::cerr << "Corrupted table in file " << fname << std::endl; std::cerr << "Corrupted table in file " << fname << std::endl;
unmap(*baseAddress, *mapping); unmap(*baseAddress, *mapping);
return *baseAddress = nullptr, nullptr; return *baseAddress = nullptr, nullptr;
@ -416,7 +434,7 @@ class TBTables {
} }
} }
std::cerr << "TB hash table size too low!" << std::endl; std::cerr << "TB hash table size too low!" << std::endl;
exit(1); exit(EXIT_FAILURE);
} }
public: public: