aboutsummaryrefslogtreecommitdiff
path: root/midend.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2018-06-21 19:02:21 +0100
committerSimon Tatham <anakin@pobox.com>2018-06-21 19:02:21 +0100
commit1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5 (patch)
treeeca9ec9acb7c496f3184207f3a05a926fdfc3657 /midend.c
parent3618f6a07f71336ad5741836afb6aeb6cae3ff99 (diff)
downloadpuzzles-1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5.zip
puzzles-1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5.tar.gz
puzzles-1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5.tar.bz2
puzzles-1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5.tar.xz
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.
Diffstat (limited to 'midend.c')
-rw-r--r--midend.c10
1 files 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 {