Re: [Patch] Fix cairo segfault when playing shogi

"H.G. Muller" <[email protected]> Fri, 9 Feb 2018 17:02:52 +0100
Newsgroups gmane.comp.gnu.xboard.devel
Message-ID <[email protected]>
Thanks for tracking this down, but the proposed fix doesn't completely 
solve all out-of-bounds accesses.

The problem here is that BlankSquare is also called with square_color = 
2, for blacking out a square.
And in that case it should never involve any texture bitmap. So the 
fundamentally correct solution is
to include the condition color < 2 when setting 'texture' in 
BlankSquare(). I will push a patch for that
to the v4.9 banch of the repo.



Op 2/4/2018 om 9:24 PM schreef Justin Vreeland:
> There's an off-by-one error caused when selecting square colors for held pieces
> that frequently causes pngBoardBitmap to access a value past it's bounds, which
> also is likely to include an invalid status field.
>
> The code in cairo and xboard seem to handle nulls well, this patch
> simply expands that array without initializing the final instance.
> ---
>   draw.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/draw.c b/draw.c
> index 8b788925..f4aa94d2 100644
> --- a/draw.c
> +++ b/draw.c
> @@ -110,7 +110,7 @@ static cairo_surface_t *pngPieceImages[2][(int)BlackPawn];   // png 256 x 256 im
>   static cairo_surface_t *pngPieceBitmaps[2][(int)BlackPawn];  // scaled pieces as used
>   static cairo_surface_t *pngPieceBitmaps2[2][(int)BlackPawn]; // scaled pieces in store
>   static RsvgHandle *svgPieces[2][(int)BlackPawn]; // vector pieces in store
> -static cairo_surface_t *pngBoardBitmap[2], *pngOriginalBoardBitmap[2];
> +static cairo_surface_t *pngBoardBitmap[3], *pngOriginalBoardBitmap[2];
>   int useTexture, textureW[2], textureH[2];
>   
>   #define pieceToSolid(piece) &pieceBitmap[SOLID][(piece) % (int)BlackPawn]