diff options
| author | Simon Tatham <anakin@pobox.com> | 2018-06-21 19:02:21 +0100 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2018-06-21 19:02:21 +0100 |
| commit | 1d9cf25f27125da2aedbcbd2fc3519e3a4b8cce5 (patch) | |
| tree | eca9ec9acb7c496f3184207f3a05a926fdfc3657 /midend.c | |
| parent | 3618f6a07f71336ad5741836afb6aeb6cae3ff99 (diff) | |
| download | puzzles-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.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -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 { |