Hi Rudolf,

Thank you very much for your patches. They fix the problems you reported
indeed and
will be included in the coming release 6.3.0.

Best regards,
Antonio Ceballos

On Mon, Jun 2, 2025 at 3:30 PM <[email protected]> wrote:

> 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