From: Rudolf Polzer <[email protected]>

The previous implementation read 4097 bytes, but always cleared the
4097th byte - so whenever the engine had more than 4096 bytes to send,
one byte will get spuriously zeroed out, leading to lichess-bot
complaining about `inf\x00` being an undefined UCI command and similar
things.

In theory this can even lead to the engine timing out and losing a game
as the UCI command with the actual move has been corrupted, but I have
never observed that happen.

As here all data corruption happens within the buffer, this cannot be
reproduced with AddressSanitizer.
---
 src/frontend/engine.cc | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/src/frontend/engine.cc b/src/frontend/engine.cc
index e8fb3a2..cb7d974 100644
--- a/src/frontend/engine.cc
+++ b/src/frontend/engine.cc
@@ -551,7 +551,7 @@ void ForwardEngineOutputToUser( void )
   fd_set set[1];
   struct timeval time_val[1];
   int engineinputready=0;
-  char engineinputaux[BUF_SIZE+1]="";
+  char engineinputaux[BUF_SIZE]="";
 
   /* Poll input from engine in non-blocking mode */
   FD_ZERO(set);
@@ -564,15 +564,13 @@ void ForwardEngineOutputToUser( void )
     printf( "Error reading engine input.\n" );
   } else if ( engineinputready > 0 ) {
     /* There are some data from the engine. Read the data */
-    strncpy( engineinputaux, zerochar, BUF_SIZE+1 );
-    nread = read( pipefd_e2a[0], engineinputaux, BUF_SIZE+1 );
-    /* Write data to output */
-    assert( nread <= BUF_SIZE+1 );
-    if (nread < BUF_SIZE+1) {
-      engineinputaux[nread] = '\0';
-    } else {
-      engineinputaux[BUF_SIZE] = '\0';
+    nread = read( pipefd_e2a[0], engineinputaux, BUF_SIZE );
+    if ( nread == -1 ) {
+      printf( "Error reading message from engine.\n" );
+      return;
     }
+    /* Write data to output */
+    assert( nread <= BUF_SIZE );
     ssize_t r = write( STDOUT_FILENO, engineinputaux, nread );
     if ( r == -1 ) {
       printf( "Error sending message to engine.\n" );
-- 
2.39.5


Reply via email to