From 271c2d5a44453f3d58f41cebc20c7436e04e860b Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Thu, 21 May 2026 02:19:43 +0900 Subject: [PATCH 01/14] feat: prevent escapes via signals --- yandere/c/yandere.c | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index fffe3b4..6938820 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -1,8 +1,43 @@ #include +#include + +typedef void sighandler_t(int sig); + +static inline void trigger_loop(const char *str); +static inline sighandler_t handle_sigint; +static inline sighandler_t handle_sigquit; +static inline sighandler_t handle_sigterm; + +const char *msgs[] = { + "이제 내가 싫어진거야? ", + "도망가려고? ", + "킥킥, 고작 그런 수로 벗어날 수 있을 거라 생각했어? ", + "어디가? 설마 도망가는건 아니지? " +}; int main(void) { - for (;;) - printf("이제 내가 싫어진거야? "); - + signal(SIGINT , handle_sigint); + signal(SIGQUIT, handle_sigquit); + signal(SIGTERM, handle_sigterm); + trigger_loop(msgs[0]); return 0; -} \ No newline at end of file +} + +static inline void trigger_loop(const char *str) { + for (;;) fputs(str, stdout); +} + +static inline void handle_sigint(int sig) { + (void) sig; + trigger_loop(msgs[1]); +} + +static inline void handle_sigquit(int sig) { + (void) sig; + trigger_loop(msgs[2]); +} + +static inline void handle_sigterm(int sig) { + (void) sig; + trigger_loop(msgs[3]); +} From 33431bdee8d28aa052bf80a431463f64d131d603 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 22 May 2026 17:19:03 +0900 Subject: [PATCH 02/14] fix: exit when sigint occurs --- yandere/c/yandere.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index 6938820..7b1ec2e 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -1,43 +1,50 @@ #include +#include #include typedef void sighandler_t(int sig); +typedef const char *conststr_t; +typedef struct _yandere_t { + conststr_t + init, sigint, sigquit, sigterm; +} yandere_t; static inline void trigger_loop(const char *str); static inline sighandler_t handle_sigint; static inline sighandler_t handle_sigquit; static inline sighandler_t handle_sigterm; -const char *msgs[] = { - "이제 내가 싫어진거야? ", - "도망가려고? ", - "킥킥, 고작 그런 수로 벗어날 수 있을 거라 생각했어? ", - "어디가? 설마 도망가는건 아니지? " +const yandere_t msgs = { + .init = "이제 내가 싫어진거야?", + .sigint = "도망갈 수 있을 거라 생각하지 마", + .sigquit = "킥킥, 고작 그런 수로 벗어날 수 있을 거라 생각했어?", + .sigterm = "어디가? 설마 도망가는건 아니지?" }; int main(void) { signal(SIGINT , handle_sigint); signal(SIGQUIT, handle_sigquit); signal(SIGTERM, handle_sigterm); - trigger_loop(msgs[0]); + trigger_loop(msgs.init); return 0; } static inline void trigger_loop(const char *str) { - for (;;) fputs(str, stdout); + for (;;) printf("%s ", str); } static inline void handle_sigint(int sig) { (void) sig; - trigger_loop(msgs[1]); + puts(msgs.sigint); + exit(EXIT_FAILURE); /* intended */ } static inline void handle_sigquit(int sig) { (void) sig; - trigger_loop(msgs[2]); + trigger_loop(msgs.sigquit); } static inline void handle_sigterm(int sig) { (void) sig; - trigger_loop(msgs[3]); + trigger_loop(msgs.sigterm); } From 0ec0b039527372ecbcf85cee84ccf22e099b1125 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 22 May 2026 17:23:46 +0900 Subject: [PATCH 03/14] fix: ignore `signal` return values --- yandere/c/yandere.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index 7b1ec2e..6483cae 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -22,9 +22,9 @@ const yandere_t msgs = { }; int main(void) { - signal(SIGINT , handle_sigint); - signal(SIGQUIT, handle_sigquit); - signal(SIGTERM, handle_sigterm); + (void) signal(SIGINT , handle_sigint); + (void) signal(SIGQUIT, handle_sigquit); + (void) signal(SIGTERM, handle_sigterm); trigger_loop(msgs.init); return 0; } From 5ba11df7752f2d5805dc84517c69145cb0c042cf Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 22 May 2026 17:25:32 +0900 Subject: [PATCH 04/14] fix: make it static --- yandere/c/yandere.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index 6483cae..a8228ab 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -14,7 +14,7 @@ static inline sighandler_t handle_sigint; static inline sighandler_t handle_sigquit; static inline sighandler_t handle_sigterm; -const yandere_t msgs = { +static const yandere_t msgs = { .init = "이제 내가 싫어진거야?", .sigint = "도망갈 수 있을 거라 생각하지 마", .sigquit = "킥킥, 고작 그런 수로 벗어날 수 있을 거라 생각했어?", From 6e7a7389b714413021d0cabbd01f525844beca7e Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 22 May 2026 17:29:57 +0900 Subject: [PATCH 05/14] fix: emphasize the sigint message --- yandere/c/yandere.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index a8228ab..dedae63 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -16,7 +16,7 @@ static inline sighandler_t handle_sigterm; static const yandere_t msgs = { .init = "이제 내가 싫어진거야?", - .sigint = "도망갈 수 있을 거라 생각하지 마", + .sigint = "\n\n도망갈 수 있을 거라 생각하지 마\n", .sigquit = "킥킥, 고작 그런 수로 벗어날 수 있을 거라 생각했어?", .sigterm = "어디가? 설마 도망가는건 아니지?" }; From e9f8d56b4865e61e4665d891302fda6d27ac6838 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Thu, 28 May 2026 08:34:45 +0900 Subject: [PATCH 06/14] fix, feat, refactor: a lot of work all in one - rewrite the program - modularize source files - add a new feature: `noise.c` applies a noise to a string --- yandere/c/.gitignore | 2 +- yandere/c/Makefile | 2 +- yandere/c/colorcodes.h | 7 +++++ yandere/c/evthandlers.c | 21 ++++++++++++++ yandere/c/evthandlers.h | 21 ++++++++++++++ yandere/c/fatal.c | 23 +++++++++++++++ yandere/c/fatal.h | 27 ++++++++++++++++++ yandere/c/global.c | 12 ++++++++ yandere/c/global.h | 34 ++++++++++++++++++++++ yandere/c/noise.c | 19 +++++++++++++ yandere/c/noise.h | 15 ++++++++++ yandere/c/sighandlers.c | 19 +++++++++++++ yandere/c/sighandlers.h | 17 +++++++++++ yandere/c/utils.c | 37 ++++++++++++++++++++++++ yandere/c/utils.h | 20 +++++++++++++ yandere/c/wrappers.c | 35 +++++++++++++++++++++++ yandere/c/wrappers.h | 22 +++++++++++++++ yandere/c/yandere.c | 59 +++++++++++---------------------------- yandere/c/yandere.types.h | 19 +++++++++++++ 19 files changed, 367 insertions(+), 44 deletions(-) create mode 100644 yandere/c/colorcodes.h create mode 100644 yandere/c/evthandlers.c create mode 100644 yandere/c/evthandlers.h create mode 100644 yandere/c/fatal.c create mode 100644 yandere/c/fatal.h create mode 100644 yandere/c/global.c create mode 100644 yandere/c/global.h create mode 100644 yandere/c/noise.c create mode 100644 yandere/c/noise.h create mode 100644 yandere/c/sighandlers.c create mode 100644 yandere/c/sighandlers.h create mode 100644 yandere/c/utils.c create mode 100644 yandere/c/utils.h create mode 100644 yandere/c/wrappers.c create mode 100644 yandere/c/wrappers.h create mode 100644 yandere/c/yandere.types.h diff --git a/yandere/c/.gitignore b/yandere/c/.gitignore index 5b52572..9197451 100644 --- a/yandere/c/.gitignore +++ b/yandere/c/.gitignore @@ -1,3 +1,3 @@ yandere yandere.exe -yandere.o \ No newline at end of file +*.o \ No newline at end of file diff --git a/yandere/c/Makefile b/yandere/c/Makefile index c7d303b..9ec1e92 100644 --- a/yandere/c/Makefile +++ b/yandere/c/Makefile @@ -1,5 +1,5 @@ CC = gcc -CCFLAGS = -O -Wall -W -pedantic +CCFLAGS = -O -Wall -W -pedantic -g TARGET = yandere diff --git a/yandere/c/colorcodes.h b/yandere/c/colorcodes.h new file mode 100644 index 0000000..4d00b71 --- /dev/null +++ b/yandere/c/colorcodes.h @@ -0,0 +1,7 @@ +#ifndef COLORCODES_H +#define COLORCODES_H + +#define Creset "\033[0m" // color reset +#define Cemerald "\033[38;5;49;1m" // emerald + +#endif diff --git a/yandere/c/evthandlers.c b/yandere/c/evthandlers.c new file mode 100644 index 0000000..c932fc6 --- /dev/null +++ b/yandere/c/evthandlers.c @@ -0,0 +1,21 @@ +#include "evthandlers.h" + +extern void evthandle_default(void) { + noise(msgs[Event_default]); + printf("%s ", buf); +} + +extern void evthandle_sigint(void) { + printf("\n\n%s\n\n", msgs[Event_sigint]); + exit(EXIT_FAILURE); /* intended */ +} + +extern void evthandle_sigquit(void) { + noise(msgs[Event_sigquit]); + printf("%s ", buf); +} + +extern void evthandle_sigterm(void) { + noise(msgs[Event_sigterm]); + printf("%s ", buf); +} diff --git a/yandere/c/evthandlers.h b/yandere/c/evthandlers.h new file mode 100644 index 0000000..e93dbe4 --- /dev/null +++ b/yandere/c/evthandlers.h @@ -0,0 +1,21 @@ +#ifndef EVTHANDLERS_H +#define EVTHANDLERS_H + +/************ + * INCLUDES * + ************/ +#include +#include +# +#include "noise.h" +#include "global.h" + +/************** + * PROTOTYPES * + **************/ +void evthandle_default(void); +void evthandle_sigint(void); +void evthandle_sigquit(void); +void evthandle_sigterm(void); + +#endif diff --git a/yandere/c/fatal.c b/yandere/c/fatal.c new file mode 100644 index 0000000..874829d --- /dev/null +++ b/yandere/c/fatal.c @@ -0,0 +1,23 @@ +#include "fatal.h" + +extern void fatal(const char *errmsg, const char *funcname) { + safe_vfprintf( + stderr, + PROGNAME ": fatal: %s in " Cemerald "%s" Creset "\n", + errmsg, funcname + ); + exit(EXIT_FAILURE); +} + +extern void vfatal(const char *errmsg, const char *funcname, ...) { + va_list ap; + int ret; + + va_start(ap, funcname); + safe_fputs(stderr, PROGNAME ": fatal: "); + safe_vfprintf(stderr, errmsg, ap); + va_end(ap); + ret = fprintf(stderr, " in " Cemerald "%s" Creset "\n", funcname); + if (ret < 0) ERR("fprintf error"); + exit(EXIT_FAILURE); +} diff --git a/yandere/c/fatal.h b/yandere/c/fatal.h new file mode 100644 index 0000000..857f393 --- /dev/null +++ b/yandere/c/fatal.h @@ -0,0 +1,27 @@ +#ifndef FATAL_H +#define FATAL_H + +/************ + * INCLUDES * + ************/ +#include +#include +#include +# +#include "global.h" +#include "wrappers.h" +#include "colorcodes.h" + +/********** + * MACROS * + **********/ +#define ERR(errmsg) fatal(errmsg, __func__) +#define VERR(errmsg, ...) vfatal(errmsg, __func__, __VA_ARGS__) + +/************** + * PROTOTYPES * + **************/ +void fatal(const char *errmsg, const char *funcname); +void vfatal(const char *errmsg, const char *funcname, ...); + +#endif diff --git a/yandere/c/global.c b/yandere/c/global.c new file mode 100644 index 0000000..bd988ec --- /dev/null +++ b/yandere/c/global.c @@ -0,0 +1,12 @@ +#include "global.h" + +const char *msgs[] = { + [Event_default] = "이제 내가 싫어진 것이다?", + [Event_sigint ] = "도망갈 수 있을 거라 생각하지 마는 것이다", + [Event_sigquit] = "발버둥치지 않는 것이다", + [Event_sigterm] = "설마 도망가려는 것이다?" +}; + +volatile sig_atomic_t event; + +char buf[BUFMAX]; diff --git a/yandere/c/global.h b/yandere/c/global.h new file mode 100644 index 0000000..780a64b --- /dev/null +++ b/yandere/c/global.h @@ -0,0 +1,34 @@ +#ifndef GLOBAL_H +#define GLOBAL_H + +/************ + * INCLUDES * + ************/ +#include + +/********** + * MACROS * + **********/ +#define PROGNAME "yandere" +#define BUFMAX 128 + +/************ + * TYPEDEFS * + ************/ +typedef void sighandler_t(int sig); + +typedef enum { + Event_default, + Event_sigint, + Event_sigquit, + Event_sigterm +} event_t; + +/******************** + * EXTERN VARIABLES * + ********************/ +extern const char *msgs[]; +extern volatile sig_atomic_t event; +extern char buf[]; + +#endif diff --git a/yandere/c/noise.c b/yandere/c/noise.c new file mode 100644 index 0000000..d475b48 --- /dev/null +++ b/yandere/c/noise.c @@ -0,0 +1,19 @@ +#include "noise.h" + +extern void noise(const char *msg) { + int i, k; + int rv, chlen; + + for (i = k = 0; msg[i] != '\0' && k < BUFMAX - 1; /* empty */) { + rv = rand_range(0, 6); + chlen = mblen_(msg[i]); + + if (rv == 0) { /* 1/6 chance */ + buf[k++] = *("#?@" + rand_range(0, 3)); + i += chlen; + } + else for (int m = 0; m < chlen; m++) + buf[k++] = msg[i++]; + } + buf[k] = '\0'; +} diff --git a/yandere/c/noise.h b/yandere/c/noise.h new file mode 100644 index 0000000..cb3f600 --- /dev/null +++ b/yandere/c/noise.h @@ -0,0 +1,15 @@ +#ifndef NOISE_H +#define NOISE_H + +/************ + * INCLUDES * + ************/ +#include "utils.h" +#include "wrappers.h" + +/************** + * PROTOTYPES * + **************/ +void noise(const char *msg); + +#endif diff --git a/yandere/c/sighandlers.c b/yandere/c/sighandlers.c new file mode 100644 index 0000000..7b9cd5d --- /dev/null +++ b/yandere/c/sighandlers.c @@ -0,0 +1,19 @@ +#include "sighandlers.h" + +extern void sighandle_sigint(int sig) { + (void) sig; + event = Event_sigint; + safe_signal(sig, sighandle_sigint); +} + +extern void sighandle_sigquit(int sig) { + (void) sig; + event = Event_sigquit; + safe_signal(sig, sighandle_sigquit); +} + +extern void sighandle_sigterm(int sig) { + (void) sig; + event = Event_sigterm; + safe_signal(sig, sighandle_sigterm); +} diff --git a/yandere/c/sighandlers.h b/yandere/c/sighandlers.h new file mode 100644 index 0000000..92722cd --- /dev/null +++ b/yandere/c/sighandlers.h @@ -0,0 +1,17 @@ +#ifndef SIGHANDLERS_H +#define SIGHANDLERS_H + +/************ + * INCLUDES * + ************/ +#include "global.h" +#include "wrappers.h" + +/************** + * PROTOTYPES * + **************/ +sighandler_t sighandle_sigint; +sighandler_t sighandle_sigquit; +sighandler_t sighandle_sigterm; + +#endif diff --git a/yandere/c/utils.c b/yandere/c/utils.c new file mode 100644 index 0000000..d903c5c --- /dev/null +++ b/yandere/c/utils.c @@ -0,0 +1,37 @@ +#include "utils.h" + +extern void seed(void) { + srand(time(NULL)); +} + +extern int rand_range(int min, int max) { + if (max <= 0) + VERR("max must be greater than 0, but given %n", max); + return min + rand() / (RAND_MAX / max + 1); +} + +extern int mblen_(char ch) { + int len, push, temp; + + /* check if 0xxxxxxx */ + if (0 <= ch) + return 1; + + /* + * handle 3 cases: + * 110xxxxx => return 2 + * 1110xxxx => return 3 + * 11110xxx => return 4 + */ + len = 0; + push = 7; + do { + temp = ch >> push; + temp &= 0x1; + if (temp == 0x1) + len++; + else break; + } while (--push); + + return len; +} diff --git a/yandere/c/utils.h b/yandere/c/utils.h new file mode 100644 index 0000000..6c2850a --- /dev/null +++ b/yandere/c/utils.h @@ -0,0 +1,20 @@ +#ifndef UTILS_H +#define UTILS_H + +/************ + * INCLUDES * + ************/ +#include +#include +# +#include "fatal.h" +#include "global.h" + +/************** + * PROTOTYPES * + **************/ +void seed(void); +int rand_range(int min, int max); +int mblen_(char ch); + +#endif diff --git a/yandere/c/wrappers.c b/yandere/c/wrappers.c new file mode 100644 index 0000000..374b8db --- /dev/null +++ b/yandere/c/wrappers.c @@ -0,0 +1,35 @@ +#include "wrappers.h" + +/*********** + * stdio.h * + ***********/ +extern void safe_putchar(char ch) { + if (putchar(ch) == EOF) + ERR("putchar error"); +} + +extern void safe_fputs(FILE *stream, const char *line) { + if (fputs(line, stream) == EOF) + ERR("fputs error"); +} + +/************ + * stdarg.h * + ************/ +extern void safe_vfprintf(FILE *stream, const char *format, ...) { + va_list ap; + int ret; + + va_start(ap, format); + ret = vfprintf(stream, format, ap); + if (ret < 0) ERR("vfprintf error"); + va_end(ap); +} + +/************ + * signal.h * + ************/ +extern void safe_signal(int sig, sighandler_t handler) { + /* intentionally ignore SIG_ERR */ + (void) signal(sig, handler); +} diff --git a/yandere/c/wrappers.h b/yandere/c/wrappers.h new file mode 100644 index 0000000..2b9198f --- /dev/null +++ b/yandere/c/wrappers.h @@ -0,0 +1,22 @@ +#ifndef WRAPPERS_H +#define WRAPPERS_H + +/************ + * INCLUDES * + ************/ +#include +#include +#include +# +#include "fatal.h" +#include "global.h" + +/************** + * PROTOTYPES * + **************/ +void safe_putchar(char ch); +void safe_fputs(FILE *stream, const char *line); +void safe_vfprintf(FILE *stream, const char *format, ...); +void safe_signal(int sig, sighandler_t handler); + +#endif diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index dedae63..ab29492 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -1,50 +1,25 @@ -#include -#include -#include - -typedef void sighandler_t(int sig); -typedef const char *conststr_t; -typedef struct _yandere_t { - conststr_t - init, sigint, sigquit, sigterm; -} yandere_t; - -static inline void trigger_loop(const char *str); -static inline sighandler_t handle_sigint; -static inline sighandler_t handle_sigquit; -static inline sighandler_t handle_sigterm; - -static const yandere_t msgs = { - .init = "이제 내가 싫어진거야?", - .sigint = "\n\n도망갈 수 있을 거라 생각하지 마\n", - .sigquit = "킥킥, 고작 그런 수로 벗어날 수 있을 거라 생각했어?", - .sigterm = "어디가? 설마 도망가는건 아니지?" -}; +#include "yandere.types.h" int main(void) { - (void) signal(SIGINT , handle_sigint); - (void) signal(SIGQUIT, handle_sigquit); - (void) signal(SIGTERM, handle_sigterm); - trigger_loop(msgs.init); + seed(); + install_sighandlers(); + event = Event_default; + for (;;) dispatch(); return 0; } -static inline void trigger_loop(const char *str) { - for (;;) printf("%s ", str); -} - -static inline void handle_sigint(int sig) { - (void) sig; - puts(msgs.sigint); - exit(EXIT_FAILURE); /* intended */ -} - -static inline void handle_sigquit(int sig) { - (void) sig; - trigger_loop(msgs.sigquit); +static void install_sighandlers(void) { + safe_signal(SIGINT , sighandle_sigint); + safe_signal(SIGQUIT, sighandle_sigquit); + safe_signal(SIGTERM, sighandle_sigterm); } -static inline void handle_sigterm(int sig) { - (void) sig; - trigger_loop(msgs.sigterm); +static void dispatch(void) { + switch (event) { + case Event_default: evthandle_default(); break; + case Event_sigint : evthandle_sigint (); break; + case Event_sigquit: evthandle_sigquit(); break; + case Event_sigterm: evthandle_sigterm(); break; + default: ERR("control reaches default"); + } } diff --git a/yandere/c/yandere.types.h b/yandere/c/yandere.types.h new file mode 100644 index 0000000..6a6a9e0 --- /dev/null +++ b/yandere/c/yandere.types.h @@ -0,0 +1,19 @@ +#ifndef YANDERE_TYPES_H +#define YANDERE_TYPES_H + +/************ + * INCLUDES * + ************/ +#include "utils.h" +#include "global.h" +#include "wrappers.h" +#include "sighandlers.h" +#include "evthandlers.h" + +/************** + * PROTOTYPES * + **************/ +static void install_sighandlers(void); +static void dispatch(void); + +#endif From 79494207048e3bea1ffc60d0cbc8a51351aafd56 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Thu, 28 May 2026 10:08:07 +0900 Subject: [PATCH 07/14] fix: prevent buffer overflow --- yandere/c/noise.c | 5 ++++- yandere/c/noise.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/yandere/c/noise.c b/yandere/c/noise.c index d475b48..d0e332b 100644 --- a/yandere/c/noise.c +++ b/yandere/c/noise.c @@ -3,11 +3,14 @@ extern void noise(const char *msg) { int i, k; int rv, chlen; + bool overflow; - for (i = k = 0; msg[i] != '\0' && k < BUFMAX - 1; /* empty */) { + for (i = k = 0; msg[i] != '\0'; /* empty */) { rv = rand_range(0, 6); chlen = mblen_(msg[i]); + overflow = (k + chlen) >= (BUFMAX - 1); + if (overflow) break; if (rv == 0) { /* 1/6 chance */ buf[k++] = *("#?@" + rand_range(0, 3)); i += chlen; diff --git a/yandere/c/noise.h b/yandere/c/noise.h index cb3f600..ca478e1 100644 --- a/yandere/c/noise.h +++ b/yandere/c/noise.h @@ -4,6 +4,8 @@ /************ * INCLUDES * ************/ +#include +# #include "utils.h" #include "wrappers.h" From da999e2ba3f1c97a4d57d6e5f2ff982589546247 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 29 May 2026 06:58:36 +0900 Subject: [PATCH 08/14] fix: address the `safe_vfprintf` issue --- yandere/c/fatal.c | 17 +++++++++++------ yandere/c/wrappers.c | 13 +++++++++++-- yandere/c/wrappers.h | 3 ++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/yandere/c/fatal.c b/yandere/c/fatal.c index 874829d..9230e10 100644 --- a/yandere/c/fatal.c +++ b/yandere/c/fatal.c @@ -1,7 +1,7 @@ #include "fatal.h" extern void fatal(const char *errmsg, const char *funcname) { - safe_vfprintf( + safe_fprintf( stderr, PROGNAME ": fatal: %s in " Cemerald "%s" Creset "\n", errmsg, funcname @@ -11,13 +11,18 @@ extern void fatal(const char *errmsg, const char *funcname) { extern void vfatal(const char *errmsg, const char *funcname, ...) { va_list ap; - int ret; - va_start(ap, funcname); safe_fputs(stderr, PROGNAME ": fatal: "); - safe_vfprintf(stderr, errmsg, ap); + + va_start(ap, funcname); + safe_vfprintf(stderr, errmsg, &ap); va_end(ap); - ret = fprintf(stderr, " in " Cemerald "%s" Creset "\n", funcname); - if (ret < 0) ERR("fprintf error"); + + safe_fprintf( + stderr, + " in " Cemerald "%s" Creset "\n", + funcname + ); + exit(EXIT_FAILURE); } diff --git a/yandere/c/wrappers.c b/yandere/c/wrappers.c index 374b8db..8c0721f 100644 --- a/yandere/c/wrappers.c +++ b/yandere/c/wrappers.c @@ -16,16 +16,25 @@ extern void safe_fputs(FILE *stream, const char *line) { /************ * stdarg.h * ************/ -extern void safe_vfprintf(FILE *stream, const char *format, ...) { +static const char *vfprintf_errmsg = "vfprintf error"; + +extern void safe_fprintf(FILE *stream, const char *format, ...) { va_list ap; int ret; va_start(ap, format); ret = vfprintf(stream, format, ap); - if (ret < 0) ERR("vfprintf error"); + if (ret < 0) ERR(vfprintf_errmsg); va_end(ap); } +extern void safe_vfprintf(FILE *stream, const char *format, va_list *ap) { + int ret; + + ret = vfprintf(stream, format, *ap); + if (ret < 0) ERR(vfprintf_errmsg); +} + /************ * signal.h * ************/ diff --git a/yandere/c/wrappers.h b/yandere/c/wrappers.h index 2b9198f..7200605 100644 --- a/yandere/c/wrappers.h +++ b/yandere/c/wrappers.h @@ -16,7 +16,8 @@ **************/ void safe_putchar(char ch); void safe_fputs(FILE *stream, const char *line); -void safe_vfprintf(FILE *stream, const char *format, ...); +void safe_fprintf(FILE *stream, const char *format, ...); +void safe_vfprintf(FILE *stream, const char *format, va_list *ap); void safe_signal(int sig, sighandler_t handler); #endif From 3b1ca0e71b1d573b5257e4a1d4b7e3c2278b5fb8 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 29 May 2026 07:00:45 +0900 Subject: [PATCH 09/14] fix: remove `safe_putchar` as not necessary --- yandere/c/wrappers.c | 5 ----- yandere/c/wrappers.h | 1 - 2 files changed, 6 deletions(-) diff --git a/yandere/c/wrappers.c b/yandere/c/wrappers.c index 8c0721f..594f277 100644 --- a/yandere/c/wrappers.c +++ b/yandere/c/wrappers.c @@ -3,11 +3,6 @@ /*********** * stdio.h * ***********/ -extern void safe_putchar(char ch) { - if (putchar(ch) == EOF) - ERR("putchar error"); -} - extern void safe_fputs(FILE *stream, const char *line) { if (fputs(line, stream) == EOF) ERR("fputs error"); diff --git a/yandere/c/wrappers.h b/yandere/c/wrappers.h index 7200605..4b7aece 100644 --- a/yandere/c/wrappers.h +++ b/yandere/c/wrappers.h @@ -14,7 +14,6 @@ /************** * PROTOTYPES * **************/ -void safe_putchar(char ch); void safe_fputs(FILE *stream, const char *line); void safe_fprintf(FILE *stream, const char *format, ...); void safe_vfprintf(FILE *stream, const char *format, va_list *ap); From 2b7d9938d1350a64821ff75e77d31317debca46b Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 29 May 2026 07:06:44 +0900 Subject: [PATCH 10/14] fix: replace an invalid format specifier --- yandere/c/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yandere/c/utils.c b/yandere/c/utils.c index d903c5c..3eed0aa 100644 --- a/yandere/c/utils.c +++ b/yandere/c/utils.c @@ -6,7 +6,7 @@ extern void seed(void) { extern int rand_range(int min, int max) { if (max <= 0) - VERR("max must be greater than 0, but given %n", max); + VERR("max must be greater than 0, but given %d", max); return min + rand() / (RAND_MAX / max + 1); } From b9af1d5592021c55f217988a8ead11d9ce8e5db1 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 29 May 2026 07:27:58 +0900 Subject: [PATCH 11/14] fix: rewrite `mblen_` --- yandere/c/utils.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/yandere/c/utils.c b/yandere/c/utils.c index 3eed0aa..bb67446 100644 --- a/yandere/c/utils.c +++ b/yandere/c/utils.c @@ -11,27 +11,14 @@ extern int rand_range(int min, int max) { } extern int mblen_(char ch) { - int len, push, temp; + unsigned char c; - /* check if 0xxxxxxx */ - if (0 <= ch) - return 1; + c = (unsigned char) ch; - /* - * handle 3 cases: - * 110xxxxx => return 2 - * 1110xxxx => return 3 - * 11110xxx => return 4 - */ - len = 0; - push = 7; - do { - temp = ch >> push; - temp &= 0x1; - if (temp == 0x1) - len++; - else break; - } while (--push); + if (c < 0x80) return 1; /* 0xxxxxxx */ + if ((c & 0xE0) == 0xC0) return 2; /* 110xxxxx */ + if ((c & 0xF0) == 0xE0) return 3; /* 1110xxxx */ + if ((c & 0xF8) == 0xF0) return 4; /* 11110xxx */ - return len; + return 0; } From 3f4fb0499fba8481f304bd097df9452a5508494d Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 29 May 2026 07:30:35 +0900 Subject: [PATCH 12/14] fix: init `event` before installing sighandlers --- yandere/c/yandere.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yandere/c/yandere.c b/yandere/c/yandere.c index ab29492..435d338 100644 --- a/yandere/c/yandere.c +++ b/yandere/c/yandere.c @@ -2,8 +2,8 @@ int main(void) { seed(); - install_sighandlers(); event = Event_default; + install_sighandlers(); for (;;) dispatch(); return 0; } From c44bdbb161b930b8be3c9e7c435013d46f9102c5 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 29 May 2026 07:39:05 +0900 Subject: [PATCH 13/14] fix: not reinstall signal handlers --- yandere/c/sighandlers.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/yandere/c/sighandlers.c b/yandere/c/sighandlers.c index 7b9cd5d..e0c7311 100644 --- a/yandere/c/sighandlers.c +++ b/yandere/c/sighandlers.c @@ -3,17 +3,14 @@ extern void sighandle_sigint(int sig) { (void) sig; event = Event_sigint; - safe_signal(sig, sighandle_sigint); } extern void sighandle_sigquit(int sig) { (void) sig; event = Event_sigquit; - safe_signal(sig, sighandle_sigquit); } extern void sighandle_sigterm(int sig) { (void) sig; event = Event_sigterm; - safe_signal(sig, sighandle_sigterm); } From 1f39d22529c2338ea7b72b429da327e42a8cd692 Mon Sep 17 00:00:00 2001 From: Doohyeon Won Date: Fri, 29 May 2026 07:43:45 +0900 Subject: [PATCH 14/14] fix: stop if `signal` fails --- yandere/c/wrappers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yandere/c/wrappers.c b/yandere/c/wrappers.c index 594f277..0b6f36f 100644 --- a/yandere/c/wrappers.c +++ b/yandere/c/wrappers.c @@ -34,6 +34,6 @@ extern void safe_vfprintf(FILE *stream, const char *format, va_list *ap) { * signal.h * ************/ extern void safe_signal(int sig, sighandler_t handler) { - /* intentionally ignore SIG_ERR */ - (void) signal(sig, handler); + if (signal(sig, handler) == SIG_ERR) + ERR("signal error"); }