shithub: puzzles

Download patch

ref: 1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5
parent: 3618f6a07f71336ad5741836afb6aeb6cae3ff99
author: Simon Tatham <anakin@pobox.com>
date: Thu Jun 21 15:02:21 EDT 2018

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.

--- a/midend.c
+++ b/midend.c
@@ -564,10 +564,12 @@
 {
     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 {