1
0
Fork 0

Prevent Stockfish from exiting if DTZ table is not present

During TB initialisation, Stockfish checks for the presence of WDL
tables but not for the presence of DTZ tables. When attempting to probe
a DTZ table, it is therefore possible that the table is not present.
In that case, Stockfish should neither exit nor report an error.

To verify the bug:
$ ./stockfish
setoption name SyzygyTable value <path_to_WDL_dir>
position fen 8/8/4r3/4k3/8/1K2P3/3P4/6R1 w - -
go infinite
Could not mmap() /opt/tb/regular/KRPPvKR.rtbz
$

(On my system, the WDL tables are in one directory and the DTZ tables
in another. If they are in the same directory, it will be difficult
to trigger the bug.)

The fix is trivial: check the file descriptor/handle after opening
the file.

No functional change.
pull/1221/merge
syzygy 2017-09-02 04:14:02 +02:00 committed by Marco Costalba
parent 3fd7e37868
commit 5ba4373522
1 changed files with 10 additions and 3 deletions

View File

@ -341,6 +341,10 @@ public:
#ifndef _WIN32
struct stat statbuf;
int fd = ::open(fname.c_str(), O_RDONLY);
if (fd == -1)
return *baseAddress = nullptr, nullptr;
fstat(fd, &statbuf);
*mapping = statbuf.st_size;
*baseAddress = mmap(nullptr, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
@ -353,6 +357,10 @@ public:
#else
HANDLE fd = CreateFile(fname.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (fd == INVALID_HANDLE_VALUE)
return *baseAddress = nullptr, nullptr;
DWORD size_high;
DWORD size_low = GetFileSize(fd, &size_high);
HANDLE mmap = CreateFileMapping(fd, nullptr, PAGE_READONLY, size_high, size_low, nullptr);
@ -380,8 +388,7 @@ public:
|| *data++ != *TB_MAGIC) {
std::cerr << "Corrupted table in file " << fname << std::endl;
unmap(*baseAddress, *mapping);
*baseAddress = nullptr;
return nullptr;
return *baseAddress = nullptr, nullptr;
}
return data;
@ -482,7 +489,7 @@ void HashTable::insert(const std::vector<PieceType>& pieces) {
TBFile file(code.insert(code.find('K', 1), "v") + ".rtbw"); // KRK -> KRvK
if (!file.is_open())
if (!file.is_open()) // Only WDL file is checked
return;
file.close();