Skip to content

Commit

Permalink
Fix a possible overflow in TT resize
Browse files Browse the repository at this point in the history
On platforms where size_t is 32 bit, we
can have an overflow in this expression:

(mbSize * 1024 * 1024)

Fix it setting max hash size of 2GB on platforms
where size_t is 32 bit.

A small rename while there: now struct Cluster
is definied inside class TranspositionTable so
we should drop the redundant TT prefix.

No functional change.
  • Loading branch information
mcostalba committed Jan 17, 2015
1 parent 58fdb84 commit 595fc34
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 8 deletions.
10 changes: 5 additions & 5 deletions src/tt.cpp
Expand Up @@ -32,17 +32,17 @@ TranspositionTable TT; // Our global transposition table

void TranspositionTable::resize(size_t mbSize) {

assert(sizeof(TTCluster) == CacheLineSize / 2);
assert(sizeof(Cluster) == CacheLineSize / 2);

size_t newClusterCount = size_t(1) << msb((mbSize * 1024 * 1024) / sizeof(TTCluster));
size_t newClusterCount = size_t(1) << msb((mbSize * 1024 * 1024) / sizeof(Cluster));

if (newClusterCount == clusterCount)
return;

clusterCount = newClusterCount;

free(mem);
mem = calloc(clusterCount * sizeof(TTCluster) + CacheLineSize - 1, 1);
mem = calloc(clusterCount * sizeof(Cluster) + CacheLineSize - 1, 1);

if (!mem)
{
Expand All @@ -51,7 +51,7 @@ void TranspositionTable::resize(size_t mbSize) {
exit(EXIT_FAILURE);
}

table = (TTCluster*)((uintptr_t(mem) + CacheLineSize - 1) & ~(CacheLineSize - 1));
table = (Cluster*)((uintptr_t(mem) + CacheLineSize - 1) & ~(CacheLineSize - 1));
}


Expand All @@ -61,7 +61,7 @@ void TranspositionTable::resize(size_t mbSize) {

void TranspositionTable::clear() {

std::memset(table, 0, clusterCount * sizeof(TTCluster));
std::memset(table, 0, clusterCount * sizeof(Cluster));
}


Expand Down
4 changes: 2 additions & 2 deletions src/tt.h
Expand Up @@ -76,7 +76,7 @@ class TranspositionTable {
static const int CacheLineSize = 64;
static const int TTClusterSize = 3;

struct TTCluster {
struct Cluster {
TTEntry entry[TTClusterSize];
char padding[2]; // Align to the cache line size
};
Expand All @@ -96,7 +96,7 @@ class TranspositionTable {

private:
size_t clusterCount;
TTCluster* table;
Cluster* table;
void* mem;
uint8_t generation8; // Size must be not bigger than TTEntry::genBound8
};
Expand Down
4 changes: 3 additions & 1 deletion src/ucioption.cpp
Expand Up @@ -54,11 +54,13 @@ bool CaseInsensitiveLess::operator() (const string& s1, const string& s2) const

void init(OptionsMap& o) {

const int MaxHashMB = Is64Bit ? 1024 * 1024 : 2048;

o["Write Debug Log"] << Option(false, on_logger);
o["Contempt"] << Option(0, -100, 100);
o["Min Split Depth"] << Option(0, 0, 12, on_threads);
o["Threads"] << Option(1, 1, MAX_THREADS, on_threads);
o["Hash"] << Option(16, 1, 1024 * 1024, on_hash_size);
o["Hash"] << Option(16, 1, MaxHashMB, on_hash_size);
o["Clear Hash"] << Option(on_clear_hash);
o["Ponder"] << Option(true);
o["MultiPV"] << Option(1, 1, 500);
Expand Down

0 comments on commit 595fc34

Please sign in to comment.