aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Harris <bjh21@bjh21.me.uk>2023-02-12 23:04:12 +0000
committerBen Harris <bjh21@bjh21.me.uk>2023-02-13 21:23:58 +0000
commitc3a5a7842eb6c41fb75a8a110a3f2cbc1c8fc5d9 (patch)
tree4d0ba1b4efe8bf4cddaf0ae8efb473e3e4c35f5a
parentffe2fa169f9fdc411d00e1c75cf3cdc5f3099727 (diff)
downloadpuzzles-c3a5a7842eb6c41fb75a8a110a3f2cbc1c8fc5d9.zip
puzzles-c3a5a7842eb6c41fb75a8a110a3f2cbc1c8fc5d9.tar.gz
puzzles-c3a5a7842eb6c41fb75a8a110a3f2cbc1c8fc5d9.tar.bz2
puzzles-c3a5a7842eb6c41fb75a8a110a3f2cbc1c8fc5d9.tar.xz
Validate that save file values are ASCII (mostly)
Apart from "SEED" records, all values in save files generated by Puzzles should be printable ASCII. This is enforced by assertion in the saving code. However, if a save file with non-ASCII move strings (for instance) manages to get loaded then these non-ASCII values can cause an assertion failure on saving. Instead, the loading code now checks values for ASCIIness. This will not only avoid problems when re-saving files, but will also defend the various internal parsers from at least some evil strings. It shouldn't invalidate any save files actually generated by Puzzles, but it will sadly invalidate some of my fuzzing corpus.
-rw-r--r--midend.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/midend.c b/midend.c
index 1769095..e71c27e 100644
--- a/midend.c
+++ b/midend.c
@@ -2329,6 +2329,13 @@ static const char *midend_deserialise_internal(
goto cleanup;
}
val[len] = '\0';
+ /* Validate that all values (apart from SEED) are printable ASCII. */
+ if (strcmp(key, "SEED"))
+ for (i = 0; val[i]; i++)
+ if (val[i] < 32 || val[i] >= 127) {
+ ret = "Forbidden characters in saved game file";
+ goto cleanup;
+ }
if (!started) {
if (strcmp(key, "SAVEFILE") || strcmp(val, SERIALISE_MAGIC)) {