From 133ef0b3a5310fe7509a8f6f9f58d93756beb468 Mon Sep 17 00:00:00 2001 From: Masahiko AMANO Date: Wed, 28 Dec 2022 01:03:19 +0300 Subject: [PATCH] fix(core): check every operation on files --- core/sappyou.c | 63 ++++++++++++++++++++++++++----------------------- core/sasahyou.c | 56 +++++++++++++++++++++++-------------------- core/shoppyou.c | 47 +++++++++++++++++++----------------- 3 files changed, 89 insertions(+), 77 deletions(-) diff --git a/core/sappyou.c b/core/sappyou.c index 9dbfd4d..a6c79f7 100644 --- a/core/sappyou.c +++ b/core/sappyou.c @@ -38,61 +38,64 @@ int sappyou_load(Sappyou *sappyou) { return 1; } uint16_t signature[4]; - rewind(sappyou->file); - fread(signature, 2, 4, sappyou->file); - if (memcmp(signature, SAPPYOU_SIG, 8) != 0) { + if (fread(signature, 2, 4, sappyou->file) < 4 || + memcmp(signature, SAPPYOU_SIG, 8) != 0 || + fread(&sappyou->created_ts, 8, 1, sappyou->file) == 0 || + fread(&sappyou->modified_ts, 8, 1, sappyou->file) == 0 || + fread(&sappyou->size, 8, 1, sappyou->file) == 0 || + fread(&sappyou->hole_cnt, 8, 1, sappyou->file) == 0) { return 1; } - fread(&sappyou->created_ts, 8, 1, sappyou->file); - fread(&sappyou->modified_ts, 8, 1, sappyou->file); - fread(&sappyou->size, 8, 1, sappyou->file); - fread(&sappyou->hole_cnt, 8, 1, sappyou->file); sappyou->database = malloc(sappyou->size * sizeof(Tanzaku)); sappyou->holes = malloc(sappyou->hole_cnt * sizeof(Tanzaku *)); size_t max_string_len = SIZE_MAX; for (uint64_t i = 0, r = sappyou->hole_cnt; i < sappyou->size; i++) { if (fgetc(sappyou->file) != 0) { sappyou->database[i].id = i; - fread(&sappyou->database[i].created_ts, 8, 1, sappyou->file); - fread(&sappyou->database[i].modified_ts, 8, 1, sappyou->file); - getdelim(&sappyou->database[i].name, &max_string_len, 0, sappyou->file); - getdelim(&sappyou->database[i].description, &max_string_len, 0, sappyou->file); + if (fread(&sappyou->database[i].created_ts, 8, 1, sappyou->file) == 0 || + fread(&sappyou->database[i].modified_ts, 8, 1, sappyou->file) == 0 || + getdelim(&sappyou->database[i].name, &max_string_len, 0, sappyou->file) == -1 || + getdelim(&sappyou->database[i].description, &max_string_len, 0, sappyou->file) == -1) { + return 1; + } } else { sappyou->database[i].id = HOLE_ID; r--; sappyou->holes[r] = sappyou->database + i; } } - return 0; + return fflush(sappyou->file); } int sappyou_save(Sappyou *sappyou) { sappyou->file = freopen(NULL, "wb", sappyou->file); - if (sappyou->file == NULL) { + if (sappyou->file == NULL || + fwrite(SAPPYOU_SIG, 2, 4, sappyou->file) < 4 || + fwrite(&sappyou->created_ts, 8, 1, sappyou->file) == 0 || + fwrite(&sappyou->modified_ts, 8, 1, sappyou->file) == 0 || + fwrite(&sappyou->size, 8, 1, sappyou->file) == 0 || + fwrite(&sappyou->hole_cnt, 8, 1, sappyou->file) == 0 || + fflush(sappyou->file) != 0) { return 1; } - rewind(sappyou->file); - fwrite(SAPPYOU_SIG, 2, 4, sappyou->file); - fwrite(&sappyou->created_ts, 8, 1, sappyou->file); - fwrite(&sappyou->modified_ts, 8, 1, sappyou->file); - fwrite(&sappyou->size, 8, 1, sappyou->file); - fwrite(&sappyou->hole_cnt, 8, 1, sappyou->file); - fflush(sappyou->file); for (uint64_t i = 0; i < sappyou->size; i++) { if (sappyou->database[i].id != HOLE_ID) { - fputc(-1, sappyou->file); - fwrite(&sappyou->database[i].created_ts, 8, 1, sappyou->file); - fwrite(&sappyou->database[i].modified_ts, 8, 1, sappyou->file); - fputs(sappyou->database[i].name, sappyou->file); - fputc(0, sappyou->file); - fputs(sappyou->database[i].description, sappyou->file); - fputc(0, sappyou->file); + if (fputc(-1, sappyou->file) == EOF || + fwrite(&sappyou->database[i].created_ts, 8, 1, sappyou->file) == 0 || + fwrite(&sappyou->database[i].modified_ts, 8, 1, sappyou->file) == 0 || + fputs(sappyou->database[i].name, sappyou->file) == EOF || + fputc(0, sappyou->file) == EOF || + fputs(sappyou->database[i].description, sappyou->file) == EOF || + fputc(0, sappyou->file) == EOF) { + return 1; + } } else { - fputc(0, sappyou->file); + if (fputc(0, sappyou->file) == EOF) { + return 1; + } } } - fflush(sappyou->file); - return 0; + return fflush(sappyou->file); } int sappyou_open(Sappyou *sappyou, const char *path) { diff --git a/core/sasahyou.c b/core/sasahyou.c index 1fcfb70..3a6ace5 100644 --- a/core/sasahyou.c +++ b/core/sasahyou.c @@ -39,56 +39,62 @@ int sasahyou_load(Sasahyou *sasahyou) { return 1; } uint16_t signature[4]; - rewind(sasahyou->file); - fread(signature, 2, 4, sasahyou->file); - if (memcmp(signature, SASAHYOU_SIG, 8) != 0) { + if (fread(signature, 2, 4, sasahyou->file) < 4 || + memcmp(signature, SASAHYOU_SIG, 8) != 0 || + fread(&sasahyou->created_ts, 8, 1, sasahyou->file) == 0 || + fread(&sasahyou->modified_ts, 8, 1, sasahyou->file) == 0 || + fread(&sasahyou->size, 8, 1, sasahyou->file) == 0 || + fread(&sasahyou->hole_cnt, 8, 1, sasahyou->file) == 0) { return 1; } - fread(&sasahyou->created_ts, 8, 1, sasahyou->file); - fread(&sasahyou->modified_ts, 8, 1, sasahyou->file); - fread(&sasahyou->size, 8, 1, sasahyou->file); - fread(&sasahyou->hole_cnt, 8, 1, sasahyou->file); sasahyou->database = malloc(sasahyou->size * sizeof(Sasa)); sasahyou->holes = malloc(sasahyou->hole_cnt * sizeof(Sasa *)); size_t max_path_len = SIZE_MAX; for (uint64_t i = 0, r = sasahyou->hole_cnt; i < sasahyou->size; i++) { if (fgetc(sasahyou->file) != 0) { sasahyou->database[i].id = i; - fread(&sasahyou->database[i].created_ts, 8, 1, sasahyou->file); - getdelim(&sasahyou->database[i].path, &max_path_len, 0, sasahyou->file); + if (fread(&sasahyou->database[i].created_ts, 8, 1, sasahyou->file) == 0 || + getdelim(&sasahyou->database[i].path, &max_path_len, 0, sasahyou->file) == -1) { + return 1; + } } else { sasahyou->database[i].id = HOLE_ID; r--; sasahyou->holes[r] = sasahyou->database + i; } } - return 0; + return fflush(sasahyou->file); } int sasahyou_save(Sasahyou *sasahyou) { sasahyou->file = freopen(NULL, "wb", sasahyou->file); - if (sasahyou->file == NULL) { + if (sasahyou->file == NULL || + fwrite(SASAHYOU_SIG, 2, 4, sasahyou->file) < 4 || + fwrite(&sasahyou->created_ts, 8, 1, sasahyou->file) == 0 || + fwrite(&sasahyou->modified_ts, 8, 1, sasahyou->file) == 0 || + fwrite(&sasahyou->size, 8, 1, sasahyou->file) == 0 || + fwrite(&sasahyou->hole_cnt, 8, 1, sasahyou->file) == 0 || + fflush(sasahyou->file) != 0) { return 1; } - rewind(sasahyou->file); - fwrite(SASAHYOU_SIG, 2, 4, sasahyou->file); - fwrite(&sasahyou->created_ts, 8, 1, sasahyou->file); - fwrite(&sasahyou->modified_ts, 8, 1, sasahyou->file); - fwrite(&sasahyou->size, 8, 1, sasahyou->file); - fwrite(&sasahyou->hole_cnt, 8, 1, sasahyou->file); - fflush(sasahyou->file); for (uint64_t i = 0; i < sasahyou->size; i++) { + if (feof(sasahyou->file) != 0 || ferror(sasahyou->file) != 0) { + return 1; + } if (sasahyou->database[i].id != HOLE_ID) { - fputc(-1, sasahyou->file); - fwrite(&sasahyou->database[i].created_ts, 8, 1, sasahyou->file); - fputs(sasahyou->database[i].path, sasahyou->file); - fputc(0, sasahyou->file); + if (fputc(-1, sasahyou->file) == EOF || + fwrite(&sasahyou->database[i].created_ts, 8, 1, sasahyou->file) == 0 || + fputs(sasahyou->database[i].path, sasahyou->file) == EOF || + fputc(0, sasahyou->file) == EOF) { + return 1; + } } else { - fputc(0, sasahyou->file); + if (fputc(0, sasahyou->file) == EOF) { + return 1; + } } } - fflush(sasahyou->file); - return 0; + return fflush(sasahyou->file); } int sasahyou_open(Sasahyou *sasahyou, const char *path) { diff --git a/core/shoppyou.c b/core/shoppyou.c index cabd32e..b6fe7c6 100644 --- a/core/shoppyou.c +++ b/core/shoppyou.c @@ -35,46 +35,49 @@ int shoppyou_load(Shoppyou *shoppyou) { return 1; } uint16_t signature[4]; - rewind(shoppyou->file); - fread(signature, 2, 4, shoppyou->file); - if (memcmp(signature, SHOPPYOU_SIG, 8) != 0) { + if (fread(signature, 2, 4, shoppyou->file) < 4 || + memcmp(signature, SHOPPYOU_SIG, 8) != 0 || + fread(&shoppyou->created_ts, 8, 1, shoppyou->file) == 0 || + fread(&shoppyou->modified_ts, 8, 1, shoppyou->file) == 0 || + fread(&shoppyou->size, 8, 1, shoppyou->file) == 0) { return 1; } - fread(&shoppyou->created_ts, 8, 1, shoppyou->file); - fread(&shoppyou->modified_ts, 8, 1, shoppyou->file); - fread(&shoppyou->size, 8, 1, shoppyou->file); shoppyou->hole_cnt = 0; free(shoppyou->holes); shoppyou->database = malloc(shoppyou->size * sizeof(Kazari)); for (uint64_t i = 0; i < shoppyou->size; i++) { - fread(&shoppyou->database[i].created_ts, 8, 1, shoppyou->file); - fread(&shoppyou->database[i].sasa_id, 8, 1, shoppyou->file); - fread(&shoppyou->database[i].tanzaku_id, 8, 1, shoppyou->file); + if (fread(&shoppyou->database[i].created_ts, 8, 1, shoppyou->file) == 0 || + fread(&shoppyou->database[i].sasa_id, 8, 1, shoppyou->file) == 0 || + fread(&shoppyou->database[i].tanzaku_id, 8, 1, shoppyou->file) == 0) { + return 1; + } } - return 0; + return fflush(shoppyou->file); } int shoppyou_save(Shoppyou *shoppyou) { shoppyou->file = freopen(NULL, "wb", shoppyou->file); - if (shoppyou->file == NULL) { + if (shoppyou->file == NULL || + fwrite(SHOPPYOU_SIG, 2, 4, shoppyou->file) < 4 || + fwrite(&shoppyou->created_ts, 8, 1, shoppyou->file) == 0 || + fwrite(&shoppyou->modified_ts, 8, 1, shoppyou->file) == 0) { return 1; } - rewind(shoppyou->file); - fwrite(SHOPPYOU_SIG, 2, 4, shoppyou->file); - fwrite(&shoppyou->created_ts, 8, 1, shoppyou->file); - fwrite(&shoppyou->modified_ts, 8, 1, shoppyou->file); uint64_t size = shoppyou->size - shoppyou->hole_cnt; - fwrite(&size, 8, 1, shoppyou->file); - fflush(shoppyou->file); + if (fwrite(&size, 8, 1, shoppyou->file) == 0 || + fflush(shoppyou->file) != 0) { + return 1; + } for (uint64_t i = 0; i < shoppyou->size; i++) { if (shoppyou->database[i].sasa_id != HOLE_ID && shoppyou->database[i].tanzaku_id != HOLE_ID) { - fwrite(&shoppyou->database[i].created_ts, 8, 1, shoppyou->file); - fwrite(&shoppyou->database[i].sasa_id, 8, 1, shoppyou->file); - fwrite(&shoppyou->database[i].tanzaku_id, 8, 1, shoppyou->file); + if (fwrite(&shoppyou->database[i].created_ts, 8, 1, shoppyou->file) == 0 || + fwrite(&shoppyou->database[i].sasa_id, 8, 1, shoppyou->file) == 0 || + fwrite(&shoppyou->database[i].tanzaku_id, 8, 1, shoppyou->file) == 0) { + return 1; + } } } - fflush(shoppyou->file); - return 0; + return fflush(shoppyou->file); } int shoppyou_open(Shoppyou *shoppyou, const char *path) {