From 1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 21 Jun 2018 19:02:21 +0100 Subject: [PATCH] Fix return value from newgame_undo_deserialise_read. The read function used by midend_deserialise and friends is expected never to perform a partial read (the main deserialisation code always knows how many bytes it can expect to see), so it's specified to return simply TRUE or FALSE for success/failure, rather than the number of bytes read. This probably wasn't breaking anything, since in the case of deserialising from an internal memory buffer a short read could only arise due to an outright bug constructing the buffer. But now I've spotted it, I should fix it. --- midend.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/midend.c b/midend.c index 1a08ef6..5a9c548 100644 --- a/midend.c +++ b/midend.c @@ -564,10 +564,12 @@ static int newgame_undo_deserialise_read(void *ctx, void *buf, int len) { struct newgame_undo_deserialise_read_ctx *const rctx = ctx; - int use = min(len, rctx->len - rctx->pos); - memcpy(buf, rctx->ser->buf + rctx->pos, use); - rctx->pos += use; - return use; + if (len > rctx->len - rctx->pos) + return FALSE; + + memcpy(buf, rctx->ser->buf + rctx->pos, len); + rctx->pos += len; + return TRUE; } struct newgame_undo_deserialise_check_ctx {