diff options
author | June McEnroe <june@causal.agency> | 2021-06-11 21:02:40 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2021-06-11 21:02:40 -0400 |
commit | c6009cf13c0fd2a2f458d2081c4ed59a07ca0ef0 (patch) | |
tree | ec71dffd1ab6b55038dc6a5e02ccdbaa49832efe /ui.c | |
parent | OpenBSD: Drop now unneeded file system access for save file (diff) | |
download | catgirl-c6009cf13c0fd2a2f458d2081c4ed59a07ca0ef0.tar.gz catgirl-c6009cf13c0fd2a2f458d2081c4ed59a07ca0ef0.zip |
Open save file with "a+"
Avoids another small TOCTOU. Rewind before loading since "a+" sets the file position at the end. Remove unnecessary fseek after truncation, since "a+" always writes at the end of the file.
Diffstat (limited to 'ui.c')
-rw-r--r-- | ui.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/ui.c b/ui.c index 82c4716..22b098e 100644 --- a/ui.c +++ b/ui.c @@ -1133,7 +1133,6 @@ static FILE *saveFile; int uiSave(void) { int error = 0 || ftruncate(fileno(saveFile), 0) - || fseek(saveFile, 0, SEEK_SET) || writeTime(saveFile, Signatures[7]) || writeTime(saveFile, self.pos); if (error) return error; @@ -1180,13 +1179,9 @@ static ssize_t readString(FILE *file, char **buf, size_t *cap) { } void uiLoad(const char *name) { - saveFile = dataOpen(name, "r+"); - if (!saveFile) { - if (errno != ENOENT) exit(EX_NOINPUT); - saveFile = dataOpen(name, "w"); - if (!saveFile) exit(EX_CANTCREAT); - return; - } + saveFile = dataOpen(name, "a+"); + if (!saveFile) exit(EX_CANTCREAT); + rewind(saveFile); time_t signature; fread(&signature, sizeof(signature), 1, saveFile); |