From f31049bb017dba516acd208567014d8f718b9a81 Mon Sep 17 00:00:00 2001 From: Marcin Serwin Date: Sun, 27 Apr 2025 10:41:59 +0200 Subject: [PATCH 1/3] consistently use CHAR_MAX for array bounds `char`s are not necessarily signed and on some architectures that means that `CHAR_MAX` is 255. This causes gcc to complain about array bound mismatch because it's hardcoded as 127 in declaration. --- src/parsing.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parsing.h b/src/parsing.h index d4be0a0..ae485ae 100644 --- a/src/parsing.h +++ b/src/parsing.h @@ -16,9 +16,9 @@ int io_getFont(bool**, char*); void io_getColor(FILE*, color*); -void io_getLevel(FILE*, level*, obj[127]); +void io_getLevel(FILE*, level*, obj[CHAR_MAX]); -void io_getObj(FILE*, obj*, char, color[127]); +void io_getObj(FILE*, obj*, char, color[CHAR_MAX]); // TODO: this is named terribly. There should be another function io_readLevels that's exposed. this should be private and take in FILE* void io_getLevels(level**, char*); From 6c3ae6c4b52855ee84aa93086fda1e237d6bc6ce Mon Sep 17 00:00:00 2001 From: Marcin Serwin Date: Sun, 27 Apr 2025 13:18:49 +0200 Subject: [PATCH 2/3] don't assume that EOF fits into char `fgetc` returns `int` and `EOF` does not necessarily fit into `char` which may cause infinite loops or premature finish of reading. --- src/parsing.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parsing.c b/src/parsing.c index 8d97a7e..786a536 100644 --- a/src/parsing.c +++ b/src/parsing.c @@ -348,8 +348,8 @@ void io_getLevels(level** ls, char* fn){ memset(io_cs, 0, sizeof(color) * CHAR_MAX); *ls = salloc(sizeof(level) * CHAR_MAX); memset(*ls, 0, sizeof(level *) * CHAR_MAX); - char c; - char name = '\0'; + int c; + int name = '\0'; while((c = fgetc(f)) != EOF){ if (c == 'C' || c == 'O' || c == 'L') { name = fgetc(f); From 582e6aab3c2d853f701a9e91410440ef1cdb93d6 Mon Sep 17 00:00:00 2001 From: Marcin Serwin Date: Sun, 27 Apr 2025 14:25:52 +0200 Subject: [PATCH 3/3] check if visual sound is started before stopping `vs_mainVisual` is initialized to -1 and `au_mainPlay` calls `vs_mainStop` before `vs_mainPlay` causing out of bounds write. --- src/visual_sounds.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/visual_sounds.c b/src/visual_sounds.c index 067e2e3..5e5cdc4 100644 --- a/src/visual_sounds.c +++ b/src/visual_sounds.c @@ -921,6 +921,9 @@ void vs_mainPlay(int snd) { } void vs_mainStop() { + if (vs_mainVisual == SND_none) { + return; + } vs_sounds[vs_mainVisual].cur = NULL; vs_mainVisual = SND_none; }