1
0
Fork 0
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:
Marco Costalba 2010-01-07 11:59:32 +01:00
parent 82179c70dc
commit 5df7d62eb9

View file

@ -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);