mirror of
https://github.com/sockspls/badfish
synced 2025-05-17 07:59:36 +00:00
Fix 'position ..... moves ' parsing bug
If after 'moves' there is a space then we crash. The problem is that operator>>() trims whitespaces so that after 'moves' has been extract we are still not at eof() but remaining string contains only spaces. So that the next extarction operation uip >> token ends up with unchanged token value that remains 'moves', this garbage value is then feeded to RootPosition.do_move() through move_from_string() that does not detect the invalid move value leading to a crash. This bug is triggered by Shredder 12 interface under Mac that puts a space after 'moves' without any actual move list. Bug fixed by Justin Blanchard After reviewing UCI parsing code I spotted other possible weak points due to the fact that we don't test if the last extract operation has been succesful. So I have extended Justing patch to fix the remaining possible holes in uci.cpp No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
82179c70dc
commit
5df7d62eb9
1 changed files with 17 additions and 29 deletions
46
src/uci.cpp
46
src/uci.cpp
|
@ -107,7 +107,8 @@ namespace {
|
||||||
UCIInputParser uip(command);
|
UCIInputParser uip(command);
|
||||||
string token;
|
string token;
|
||||||
|
|
||||||
uip >> token; // operator>>() skips any whitespace
|
if (!(uip >> token)) // operator>>() skips any whitespace
|
||||||
|
return true;
|
||||||
|
|
||||||
if (token == "quit")
|
if (token == "quit")
|
||||||
return false;
|
return false;
|
||||||
|
@ -159,14 +160,8 @@ namespace {
|
||||||
else if (token == "perft")
|
else if (token == "perft")
|
||||||
perft(uip);
|
perft(uip);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
cout << "Unknown command: " << command << endl;
|
cout << "Unknown command: " << command << endl;
|
||||||
while (!uip.eof())
|
|
||||||
{
|
|
||||||
uip >> token;
|
|
||||||
cout << token << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,33 +176,33 @@ namespace {
|
||||||
|
|
||||||
string token;
|
string token;
|
||||||
|
|
||||||
uip >> token; // operator>>() skips any whitespace
|
if (!(uip >> token)) // operator>>() skips any whitespace
|
||||||
|
return;
|
||||||
|
|
||||||
if (token == "startpos")
|
if (token == "startpos")
|
||||||
RootPosition.from_fen(StartPosition);
|
RootPosition.from_fen(StartPosition);
|
||||||
else if (token == "fen")
|
else if (token == "fen")
|
||||||
{
|
{
|
||||||
string fen;
|
string fen;
|
||||||
while (token != "moves" && !uip.eof())
|
while (uip >> token && token != "moves")
|
||||||
{
|
{
|
||||||
uip >> token;
|
|
||||||
fen += token;
|
fen += token;
|
||||||
fen += ' ';
|
fen += ' ';
|
||||||
}
|
}
|
||||||
RootPosition.from_fen(fen);
|
RootPosition.from_fen(fen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!uip.eof())
|
if (uip.good())
|
||||||
{
|
{
|
||||||
if (token != "moves")
|
if (token != "moves")
|
||||||
uip >> token;
|
uip >> token;
|
||||||
|
|
||||||
if (token == "moves")
|
if (token == "moves")
|
||||||
{
|
{
|
||||||
Move move;
|
Move move;
|
||||||
StateInfo st;
|
StateInfo st;
|
||||||
while (!uip.eof())
|
while (uip >> token)
|
||||||
{
|
{
|
||||||
uip >> token;
|
|
||||||
move = move_from_string(RootPosition, token);
|
move = move_from_string(RootPosition, token);
|
||||||
RootPosition.do_move(move, st);
|
RootPosition.do_move(move, st);
|
||||||
if (RootPosition.rule_50_counter() == 0)
|
if (RootPosition.rule_50_counter() == 0)
|
||||||
|
@ -231,18 +226,14 @@ namespace {
|
||||||
|
|
||||||
string token, name;
|
string token, name;
|
||||||
|
|
||||||
uip >> token;
|
if (!(uip >> token)) // operator>>() skips any whitespace
|
||||||
if (token == "name")
|
return;
|
||||||
{
|
|
||||||
uip >> name;
|
|
||||||
while (!uip.eof())
|
|
||||||
{
|
|
||||||
uip >> token;
|
|
||||||
if (token == "value")
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
if (token == "name" && uip >> name)
|
||||||
|
{
|
||||||
|
while (uip >> token && token != "value")
|
||||||
name += (" " + token);
|
name += (" " + token);
|
||||||
}
|
|
||||||
if (token == "value")
|
if (token == "value")
|
||||||
{
|
{
|
||||||
// Reads until end of line and left trim white space
|
// Reads until end of line and left trim white space
|
||||||
|
@ -276,10 +267,8 @@ namespace {
|
||||||
|
|
||||||
searchMoves[0] = MOVE_NONE;
|
searchMoves[0] = MOVE_NONE;
|
||||||
|
|
||||||
while (!uip.eof())
|
while (uip >> token)
|
||||||
{
|
{
|
||||||
uip >> token;
|
|
||||||
|
|
||||||
if (token == "infinite")
|
if (token == "infinite")
|
||||||
infinite = true;
|
infinite = true;
|
||||||
else if (token == "ponder")
|
else if (token == "ponder")
|
||||||
|
@ -327,10 +316,9 @@ namespace {
|
||||||
int depth, tm, n;
|
int depth, tm, n;
|
||||||
Position pos = RootPosition;
|
Position pos = RootPosition;
|
||||||
|
|
||||||
if (uip.eof())
|
if (!(uip >> depth))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uip >> depth;
|
|
||||||
tm = get_system_time();
|
tm = get_system_time();
|
||||||
|
|
||||||
n = perft(pos, depth * OnePly);
|
n = perft(pos, depth * OnePly);
|
||||||
|
|
Loading…
Add table
Reference in a new issue