From 2e05624b41f33fac3bb3b36362ced2e1fdda60a8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:41:54 +0000 Subject: [PATCH 01/14] Initial plan From ea91d24079ab45e1128976706ab45cc10d300ec1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:45:45 +0000 Subject: [PATCH 02/14] Fix str_count_char off-by-one Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- lib/libSDL_rotozoom.so | Bin 21156 -> 0 bytes src/common/utils/str.c | 4 ++-- test/Makefile | 11 ++++++++++- test/test_str.c | 13 +++++++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) delete mode 100755 lib/libSDL_rotozoom.so create mode 100644 test/test_str.c diff --git a/lib/libSDL_rotozoom.so b/lib/libSDL_rotozoom.so deleted file mode 100755 index 9cd4d885962695cb77299297fa07af57508466db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21156 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 VLiNQprB#a`;AU!$LIS6X{|9ocGavu} diff --git a/src/common/utils/str.c b/src/common/utils/str.c index 0817ef4584..d768447fad 100644 --- a/src/common/utils/str.c +++ b/src/common/utils/str.c @@ -195,7 +195,7 @@ void str_serializeTime(char *dest_str, int nTime) int str_count_char(const char *str, char ch) { int i, count = 0; - for (i = 0; i <= strlen(str); i++) { + for (i = 0; i < strlen(str); i++) { if (str[i] == ch) { count++; } @@ -214,4 +214,4 @@ bool includeCJK(char *str) str++; } return false; -} \ No newline at end of file +} diff --git a/test/Makefile b/test/Makefile index 7d13b1aa0c..ca54ac5d6f 100644 --- a/test/Makefile +++ b/test/Makefile @@ -6,5 +6,14 @@ include ../src/common/config.mk TARGET = test LDFLAGS := $(LDFLAGS) -L../lib -s -lSDL_image -lSDL -lSDL_rotozoom -lgtest -lgtest_main -lpthread +STR_TEST_TARGET = str_test +STR_TEST_OFILES = test_str.o ../src/common/utils/str.o + include ../src/common/commands.mk -include ../src/common/recipes.mk \ No newline at end of file +include ../src/common/recipes.mk + +$(STR_TEST_TARGET): $(STR_TEST_OFILES) + @mkdir -p "$(BUILD_DIR)" + @$(CC) $(STR_TEST_OFILES) -o "$(BUILD_DIR)/$(STR_TEST_TARGET)" + +str-test: $(STR_TEST_TARGET) diff --git a/test/test_str.c b/test/test_str.c new file mode 100644 index 0000000000..5c871381cd --- /dev/null +++ b/test/test_str.c @@ -0,0 +1,13 @@ +#include + +#include "../src/common/utils/str.h" + +int main(void) +{ + assert(str_count_char("", 'a') == 0); + assert(str_count_char("abc", 'a') == 1); + assert(str_count_char("a/b/c", '/') == 2); + assert(str_count_char("abc", '\0') == 0); + + return 0; +} From bb99bbccfadf98753458023b1272714a28e9f4e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:46:03 +0000 Subject: [PATCH 03/14] Restore tracked SDL helper library Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- lib/libSDL_rotozoom.so | Bin 0 -> 21156 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 lib/libSDL_rotozoom.so diff --git a/lib/libSDL_rotozoom.so b/lib/libSDL_rotozoom.so new file mode 100755 index 0000000000000000000000000000000000000000..9cd4d885962695cb77299297fa07af57508466db GIT binary patch literal 21156 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 VLiNQprB#a`;AU!$LIS6X{|9ocGavu} literal 0 HcmV?d00001 From 53f2ae16f3d9e0840f2ccd7385a1a5f7c9b02677 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:46:55 +0000 Subject: [PATCH 04/14] Optimize str_count_char loop Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- src/common/utils/str.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/utils/str.c b/src/common/utils/str.c index d768447fad..8b81c6fefb 100644 --- a/src/common/utils/str.c +++ b/src/common/utils/str.c @@ -195,7 +195,8 @@ void str_serializeTime(char *dest_str, int nTime) int str_count_char(const char *str, char ch) { int i, count = 0; - for (i = 0; i < strlen(str); i++) { + int len = strlen(str); + for (i = 0; i < len; i++) { if (str[i] == ch) { count++; } From f212431ec2d082c6d9761d3e90e432c81a9b6653 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:02:10 +0000 Subject: [PATCH 05/14] Clamp negative serialized times Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- src/common/utils/str.c | 4 ++++ test/test_str.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/common/utils/str.c b/src/common/utils/str.c index 8b81c6fefb..5d08fd952f 100644 --- a/src/common/utils/str.c +++ b/src/common/utils/str.c @@ -177,6 +177,10 @@ void str_removeParentheses(char *str_out, const char *str_in) void str_serializeTime(char *dest_str, int nTime) { + if (nTime < 0) { + nTime = 0; + } + if (nTime >= 60) { int h = nTime / 3600; int m = (nTime - 3600 * h) / 60; diff --git a/test/test_str.c b/test/test_str.c index 5c871381cd..d3acd5c5f3 100644 --- a/test/test_str.c +++ b/test/test_str.c @@ -1,13 +1,31 @@ #include +#include #include "../src/common/utils/str.h" int main(void) { + char out[STR_MAX]; + assert(str_count_char("", 'a') == 0); assert(str_count_char("abc", 'a') == 1); assert(str_count_char("a/b/c", '/') == 2); assert(str_count_char("abc", '\0') == 0); + str_serializeTime(out, -1); + assert(strcmp(out, "0s") == 0); + + str_serializeTime(out, 0); + assert(strcmp(out, "0s") == 0); + + str_serializeTime(out, 59); + assert(strcmp(out, "59s") == 0); + + str_serializeTime(out, 60); + assert(strcmp(out, "1m 0s") == 0); + + str_serializeTime(out, 3600); + assert(strcmp(out, "1h 0m") == 0); + return 0; } From b24ee8e78767d93604e8eeb8f9c6680d489bacd3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:02:59 +0000 Subject: [PATCH 06/14] Expand string utility regression tests Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- test/test_str.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_str.c b/test/test_str.c index d3acd5c5f3..6f18f43aee 100644 --- a/test/test_str.c +++ b/test/test_str.c @@ -6,11 +6,13 @@ int main(void) { char out[STR_MAX]; + char hidden_suffix[] = {'a', '\0', 'b', '\0'}; assert(str_count_char("", 'a') == 0); assert(str_count_char("abc", 'a') == 1); assert(str_count_char("a/b/c", '/') == 2); assert(str_count_char("abc", '\0') == 0); + assert(str_count_char(hidden_suffix, 'b') == 0); str_serializeTime(out, -1); assert(strcmp(out, "0s") == 0); From 4267171030d933807f76eeffbf83e7e9f7c160e3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:14:54 +0000 Subject: [PATCH 07/14] Fix str_trim empty input handling Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- src/common/utils/str.c | 21 +++++++++++---------- test/test_str.c | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/common/utils/str.c b/src/common/utils/str.c index 5d08fd952f..086b3d5d25 100644 --- a/src/common/utils/str.c +++ b/src/common/utils/str.c @@ -94,27 +94,28 @@ size_t str_trim(char *out, size_t len, const char *str, bool first) bool is_string = false; // Trim leading space - while (strchr("\r\n\t {},", (unsigned char)*str) != NULL) + while (*str != 0 && strchr("\r\n\t {},", (unsigned char)*str) != NULL) str++; - end = str + 1; + if (*str == 0) // All spaces? + { + *out = 0; + return 0; + } if ((unsigned char)*str == '"') { is_string = true; str++; - while (strchr("\r\n\"", (unsigned char)*end) == NULL) + end = str; + while (*end != 0 && strchr("\r\n\"", (unsigned char)*end) == NULL) end++; } - - if (*str == 0) // All spaces? - { - *out = 0; - return 1; - } + else + end = str; // Trim trailing space if (first) - while (strchr("\r\n\t {},", (unsigned char)*end) == NULL) + while (*end != 0 && strchr("\r\n\t {},", (unsigned char)*end) == NULL) end++; else { end = str + strlen(str) - 1; diff --git a/test/test_str.c b/test/test_str.c index 6f18f43aee..6325119725 100644 --- a/test/test_str.c +++ b/test/test_str.c @@ -7,6 +7,7 @@ int main(void) { char out[STR_MAX]; char hidden_suffix[] = {'a', '\0', 'b', '\0'}; + size_t trimmed; assert(str_count_char("", 'a') == 0); assert(str_count_char("abc", 'a') == 1); @@ -14,6 +15,22 @@ int main(void) assert(str_count_char("abc", '\0') == 0); assert(str_count_char(hidden_suffix, 'b') == 0); + trimmed = str_trim(out, sizeof(out), "", false); + assert(trimmed == 0); + assert(strcmp(out, "") == 0); + + trimmed = str_trim(out, sizeof(out), " ", false); + assert(trimmed == 0); + assert(strcmp(out, "") == 0); + + trimmed = str_trim(out, sizeof(out), " abc ", false); + assert(trimmed == 3); + assert(strcmp(out, "abc") == 0); + + trimmed = str_trim(out, sizeof(out), "\"abc\"", false); + assert(trimmed == 3); + assert(strcmp(out, "abc") == 0); + str_serializeTime(out, -1); assert(strcmp(out, "0s") == 0); From bfdc15ab41a244d1f9808889985c58ef7c537b7c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:20:46 +0000 Subject: [PATCH 08/14] Guard str_removeParentheses buffer writes Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- src/common/utils/str.c | 3 ++- test/test_str.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/common/utils/str.c b/src/common/utils/str.c index 086b3d5d25..0649d952db 100644 --- a/src/common/utils/str.c +++ b/src/common/utils/str.c @@ -168,7 +168,8 @@ void str_removeParentheses(char *str_out, const char *str_in) inside = false; continue; } - temp[c++] = str_in[i]; + if (c < STR_MAX - 1) + temp[c++] = str_in[i]; } temp[c] = '\0'; diff --git a/test/test_str.c b/test/test_str.c index 6325119725..3e0a29ff52 100644 --- a/test/test_str.c +++ b/test/test_str.c @@ -7,6 +7,7 @@ int main(void) { char out[STR_MAX]; char hidden_suffix[] = {'a', '\0', 'b', '\0'}; + char long_name[STR_MAX + 32]; size_t trimmed; assert(str_count_char("", 'a') == 0); @@ -31,6 +32,16 @@ int main(void) assert(trimmed == 3); assert(strcmp(out, "abc") == 0); + str_removeParentheses(out, "Game Title (USA) [Hack]"); + assert(strcmp(out, "Game Title") == 0); + + memset(long_name, 'x', sizeof(long_name) - 1); + long_name[sizeof(long_name) - 1] = '\0'; + str_removeParentheses(out, long_name); + assert(strlen(out) == STR_MAX - 2); + for (size_t i = 0; i < strlen(out); i++) + assert(out[i] == 'x'); + str_serializeTime(out, -1); assert(strcmp(out, "0s") == 0); From 63f423f657e433ea9d6177667f4e7faee7178994 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:44:07 +0000 Subject: [PATCH 09/14] chore: finalize no-op validation Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- lib/libSDL_rotozoom.so | Bin 21156 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 lib/libSDL_rotozoom.so diff --git a/lib/libSDL_rotozoom.so b/lib/libSDL_rotozoom.so deleted file mode 100755 index 9cd4d885962695cb77299297fa07af57508466db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21156 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 VLiNQprB#a`;AU!$LIS6X{|9ocGavu} From 49064d7d6c2862fee708f4325a099fed19b5bb9a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 19:44:21 +0000 Subject: [PATCH 10/14] chore: restore tracked SDL library after test cleanup Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- lib/libSDL_rotozoom.so | Bin 0 -> 21156 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 lib/libSDL_rotozoom.so diff --git a/lib/libSDL_rotozoom.so b/lib/libSDL_rotozoom.so new file mode 100755 index 0000000000000000000000000000000000000000..9cd4d885962695cb77299297fa07af57508466db GIT binary patch literal 21156 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 VLiNQprB#a`;AU!$LIS6X{|9ocGavu} literal 0 HcmV?d00001 From bc67b2aa7d743952ff562bf4b0308e2d89532a89 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 20:09:17 +0000 Subject: [PATCH 11/14] chore: outline plan for severe bug fixes Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- lib/libSDL_rotozoom.so | Bin 21156 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 lib/libSDL_rotozoom.so diff --git a/lib/libSDL_rotozoom.so b/lib/libSDL_rotozoom.so deleted file mode 100755 index 9cd4d885962695cb77299297fa07af57508466db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21156 zcmeHP4{%(?dEa+;HfNn|pRtIACF3&@MUJi0VXL+Ht~N7CJIyN3Mt&7i z8Is4UJ6~pw)x^4ynPW3$P;E+4m|+2Pke68H>ByZ(U$J0jgxN23Ltf28Vw#w>X94Rd z6KU6d>*2Rv_wRUQ+5Vk>OCtI%@i2{{Ymu>upOwC)n`nX`p7<&y`}4S(Gq! zvR0PNf7c>oow|G|L=}LXdOWVdqz!8@@zZSlpV#oD*U-WT_^1v49StVG|I}c%AF;vb zZ1B}u2c%!D;e9B7puxodF;Wi{9mS+yiJ9LF*o{eTMI!t?z&oLsAxt3Q1AyO}51Yqi z5grCyUL(YVm_)+g0K5f^y)a0^A{gA>8|w=ulA(Aq7!<)<+BO8c!twC-NFo`Iw{2*O z#`?l-p^j+S#1+Q`J9mbH-I2afG;&{9+!u@WZW@SphdRR>*R5(4y`g9{)+xH<;W4pJPCaI!Jl-xHEZ08O!IEWSQGX!7ZU*kj1oVhE~vG}6)OPsIGo z#JZMSRy75e`0Jot>*88b$*dw&xaf)WznfqeoNr!bkqDNdL#(lEg}#bww9Lx6UI=eN zeii0%8*{9wcIKGUF6J=KQsiI3ynC6$hRT?OzMMH0awT&(9UpTrtYQwks%DO*xtKZZ zD!?3k>zJ1cQO_I_u4E1;(!d-}Yc+E?wPxlRObc^3yjJFL6m87m$lMJzzkrK9>3;CX zCtRtTj4O30Gb6P(?`sKaHX21H#vC>bUCXE1&yyq5h0k{y;0grqQJD}P%nAJoc^XytEegTd%wo_9u{Tw1(F(CC?eOhQk+vK-XJ9|tZjxY7FpL&PW=i^rfUZqG+fL|B*wSZTP z#fLmZ;7!OU`=7;ryqI4l6Rf_Znlg$*$NwysJNYV7C1ArhG{SKU--{V9?BFHvZbRAv z{s)nN6X^)_01yUM^9$GTqsMk0*>J31crr<^C$rOs6sVB>UW-2ZQFaFoWQ;)5v3)D9 z$R5A%Z1#A`C)w94j-EQas6Css@Oj+aPqK$SFJx2qf0o_1Vouf@@MOrNvG3O0KX{Q)U-vqsjz)*TM zWL$0O4J&P~2&6`SXoyj^F~?qLpY4eE0(J&=r3kxGrtIXQ#^MHzQ*2C+=5p_l ze-&_)sS-KiQsnHf5_MHpe=M^<(o~_${@9NAGQjMQa4E{{k35tfO11ttpJkY{mB6n= zx!$5JRrF<*>)F>;QZWnDJn9f94c0O|uM*CDU7Xj!IR==1kFc#G4% z5xEA%=?2c9fQ;1R7SLB}@HW8gm%e~{s8(g@U<-7)-|0*>)uUd{%^Okqpf|nLx+2qw4A`I<6hs7uOv9 zfg9!X`LCK>?m4a-<(JeNqFnvpH@x7DG}j8(kXodKBAy8of<&+b1b zV+Yy^bueaMM*H`*_I8}!o;IcWkoy8;z0H(6t$Z}&E45$0hPfg=c`EuQi=Oi#=MeM= z@#oUNTWw3~ppSs0OO5<9cu+6ppeKzNIbrU(2;E1^F~9VcTpOg}`uS@0P})m=)?Uti zfH>CCp2oNy`mpx;XLYx;#T<$6=&pi51+geIJ>R`kV(zE;-%&vw``+6@D;u{W!xlVbi(L|u^Q!P z-@1OPfTz!+92c^I;~0z52Yrt6dAcvw=aznuF&q0O{|n9azkxq(ec)W~WIgf(a*l0` z576Qo*Kkcn;Qk^Bf6xPe5cMK%!u>@Oef6Mkx9>nE${gcotg(CfP@3~cT&abVYth0{ zH~qjlVYlwUw=(_Sip*p5>A+L|q=j?YaB2@?KfI4o`ww{&rk|i3oNwAO%WA&!@-f~= zKlB@v?|gA(J@BRIpT1#<1CRf#HMr1$djaUWlrn-3ZHIEMMBRR;1M-{mpzPRO^9t|8 zJ*wGG*@;@;^ea=rn>NF}j(ZsAm}T}s+crdEO|$N6UY1C*uyF<#mUx>g*J9P>mM_A>c?(R_Wteqpga@leXphu zJcG#hH<4Z2`@GPY&uhoFxrss+HSg4e(m&_@a*TbVwXwlA4^>+K6X~LuT-3)zHad|$ zCYmeAG^(#x+ON{lZz`i*Hy2~W^v#T|nlVrG%`CT|ye)9Iyro{vk3n?HU5;P)1nO) zp$%%Zmm&-A)9FXobQ5BEwh`YQv>7=myaV9q7?O2#m5l-0emiecQK=YIXm&vMVz0Z%{0 zwxnlVqMp@}p0Sa7R(AyS9avi`mbnY%-&QQM9K5++7{4R}|AOaBg?NUrifI^!U_X{I z4a@L{&vC6Y##1p3_Q`QE4Px+1j!md9`T=zxf4S!41>9R-%zPXIy?lOn`6x$SmJyQFVdcFVrFS1UW^eWJ2cr62B9 zT#vLwv?7dkBtemwcwheU|YrY3T>J1_YiF%6m+dFXT74 z_U(Q{&4=wZJosr~uTFl=-mZ1j4M=hVUql6Pi7z5Qa|Rin4ys;a8JWJ z&c6%KLw&?)&+jQK$H_J>?DIOUTdU*!5&f2r^soogxxIK#gq(JttK&10M>Dy4KBGat za%jZG9Bl-0A9FD@^0TwKlWxdNUet&14vp*+6`7x-9&$9?{yq zVu*KGFWS^>l6Z(7itLxKes@A7jH;lU3tOI=Jy7lQ<;7wVEJfZ9? zw7W`!uL3+1u*bsB1Uy@VX9IRqSJ3}o)$-nVSL#K)=aTQvJZH0WEIjAC82)PD+20(C ze}x5KZNc*ZQ$B^CZ@~(`0B{BH3ncwFvZ;#G*@{Ibobtr8)KjV=uitmZ&;p0|X``wx zYsgw7JZauy+oX3XECPL%U}A6I#40oPRk5ks6R@Y2 z(0{4tboALS-+si*`{Dml_CA&=M{>i5yTrasB~qz)6u3u0_bB+8zMnC+7xdf%);d?Rjui`&&fGVcbKhXjwr=El+vQeU_O}sbB`2QWl+2_KxDLKHCp%k}=g!FUt#`ASa%cZXrE)=U0A<|YDRoo&2^4gY9`{-#a{EhkRG4@2lP{o z_FptU)oE3H$~t>|D(k#_7j<#*>3liXvGHj&#(5p;X~T?vnKM3}4j*$^i!qDFr-&=L zRv*6r-8s;?@6Gw0Ilmdj@8Kkj=O^MVq+flWi|s*sG!*Q|0`gc3o4`3SafQTQ~dKVzFpvPbkvo!-vVfWKY=FSkoVm zbw{Eo#XEZ<$#7?KARhMB`U`p zB8+Mjr!22&6jMvCXmlIX93{?D<4RYVag{O0S#Dfy%ym>6*UAAe2B|{|#~CxvJE%g= zxu$+O*CvKoe7B3_5cn0SRht4G@!z)5;ddyCZ$YuB!#fBuh-5ryQgA+927bkdGZlpR zQ=|fgF-v%-Zl3C#Q8DAX8MD!m7+=$aTBrQ7-C_LijOhYrIIuq?!|$(63?{n5{fSy= zOo+~SGUDGPEm}-*q+p58n~mB)EiT7YG(;sw?R--h0f)n^;P9O(VMw_3qWbF7`Xbv} zlL>mEuAIwFaIBEEmW;K@-u~LI?Hw_E7GK-Zk*JOLgm={J=&i4*L222}`engob+sJ> zk!Tlah_&i!YG@qMNZ-KDn(ci9G>4vUldv`s@2uU<56Npg69aj{In6l{^b;m*S|t6137adK z{=u7*5J%QnZtT%8R;xlNef$sDr@(@U9SHeq_h z!uXuhE1Le$#N(|WF8V`WPV4jywEYD6Ho6p_G}8m(LA2su5dY}chq5?j8V9p zat-M)y=dWb$`e6!Se*i5);Z;=Av(Uonjy2!B|ggCf+ClYd3i*O20P%@w*o$=;Ym;1 zF|TQYFm1@ZO69lX3d-}h(HHEkR6M1Kkt=%Ir+Ik1Rk*Un8@UM8Mr zg(#T#6Ter0rTo_yVB+`X=i4)G{)jL5i|JxLD}50E5Mag|yoi4sMP;83oE1a)l|Nv#Lix_*?Xg7S&uZ|KCM&X&tNZ(a z^|Mr70IZ*#@`gsw-4x%S8ter;53qjrO09+`eWM1G{$=pj&t|#Z zhVRy3ALs`(nC%BOnEW5sVB-HAuzuFdU)%7{*x(=9;8!%*2Yw@f^|NPwso~k5sEzd} zYkMPuIQ}Kl7pY0ANUF9Y(pQV^tk^y%H@|^IycPv>tBr}Okm$sbF~L6!hrS-{?h{pA zmxXnoKgNI~ksRpm_IHZHDL27nZ?Kc++$3-uPFF0rJsRr>MT1?*SUeF74eZ1bGQIuL za5CKGzag-^E>N6`=ifwvp?Ewr7!3C%;^cwpqJMy3&C4oBPCOGC?pN59QK{pef6U1|VbXs}%j=eve z>LX7D(g~>q`x!jr4*0PhSi}>4%=3ZloC>D^X@>@FmB#^D9TiUg**xZ?A33<92OVjg zq{7HZKT=5e6NA0UPzUm4+{}Aa39+BQCzR+B{;t73kePWhF8svo2*(qVSl<{R2wXfI zCB0ebk0ym*PNzQ^-ifj_41c)CG%gco+Leh@WpD`fMmoVghE`pnWJvfs5((jlW%t5Z zg}-s*27f4-j7K^Kl2`}+u5ib|b~F$5Z7+b4zV28a)zJ|T?@$oJ+psEQz^Z69r*rsX z7rtE*bm4R@j76EAMN;>T3@4d*kNYw1CrQT`m1!l)cDn0O$1Rg|j9rTXhD18X z#!S4IR{TiMkO03CmvrRY02(IVlar2-s-o*enfw{%aqna@BV$zHA|0=LkrbV}uRbd= z=0DOgMUWI7V@swVEi`HPUxh0%jgBz@lfscs^*dnEalDKrm=sQ@djJ3phbILn}#PO0&#v%=f8CbS1(lLDpNzpOJ z>1inN0xHkm6@?Grhh^LuYP3m`e}m@ORX|9 z((rl(NtFqoZ9pu*f^|_QUT-7mbghjz$4g?&e+u`WjqV`ms*2G4kB#m}p!?S%be~&v zYP>sP*iYK%*f-DXW3I09Cfp+^0J$0mX=qdGY6o2_CVU<$Zbjmpd6Br*puhYzd<$T$ VLiNQprB#a`;AU!$LIS6X{|9ocGavu} From 791cab5f83a079c83ef73b63f606bee5196f2891 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 20:11:27 +0000 Subject: [PATCH 12/14] fix: harden file read and write helpers Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- lib/libSDL_rotozoom.so | Bin 0 -> 21156 bytes src/common/utils/file.c | 25 ++++++++++++++++++++----- test/Makefile | 2 +- test/test_str.c | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) create mode 100755 lib/libSDL_rotozoom.so diff --git a/lib/libSDL_rotozoom.so b/lib/libSDL_rotozoom.so new file mode 100755 index 0000000000000000000000000000000000000000..9cd4d885962695cb77299297fa07af57508466db GIT binary patch literal 21156 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 VLiNQprB#a`;AU!$LIS6X{|9ocGavu} literal 0 HcmV?d00001 diff --git a/src/common/utils/file.c b/src/common/utils/file.c index 49b9ea90ad..a3c85f7406 100644 --- a/src/common/utils/file.c +++ b/src/common/utils/file.c @@ -129,10 +129,18 @@ char *file_read(const char *path) length = ftell(f); fseek(f, 0, SEEK_SET); buffer = (char *)malloc((length + 1) * sizeof(char)); - if (buffer) - fread(buffer, sizeof(char), length, f); + if (!buffer) { + fclose(f); + return NULL; + } + + fread(buffer, sizeof(char), length, f); fclose(f); } + else { + return NULL; + } + buffer[length] = '\0'; return buffer; @@ -140,11 +148,18 @@ char *file_read(const char *path) bool file_write(const char *path, const char *str, uint32_t len) { - uint32_t fd; - if ((fd = open(path, O_WRONLY)) == 0) + int fd; + ssize_t written; + + if ((fd = open(path, O_WRONLY)) == -1) return false; - if (write(fd, str, len) == -1) + + written = write(fd, str, len); + if (written == -1 || (uint32_t)written != len) { + close(fd); return false; + } + close(fd); return true; } diff --git a/test/Makefile b/test/Makefile index ca54ac5d6f..09d6cc385d 100644 --- a/test/Makefile +++ b/test/Makefile @@ -7,7 +7,7 @@ TARGET = test LDFLAGS := $(LDFLAGS) -L../lib -s -lSDL_image -lSDL -lSDL_rotozoom -lgtest -lgtest_main -lpthread STR_TEST_TARGET = str_test -STR_TEST_OFILES = test_str.o ../src/common/utils/str.o +STR_TEST_OFILES = test_str.o ../src/common/utils/str.o ../src/common/utils/file.o include ../src/common/commands.mk include ../src/common/recipes.mk diff --git a/test/test_str.c b/test/test_str.c index 3e0a29ff52..c4187012d4 100644 --- a/test/test_str.c +++ b/test/test_str.c @@ -1,6 +1,9 @@ #include +#include #include +#include +#include "../src/common/utils/file.h" #include "../src/common/utils/str.h" int main(void) @@ -57,5 +60,23 @@ int main(void) str_serializeTime(out, 3600); assert(strcmp(out, "1h 0m") == 0); + char temp_path[] = "/tmp/onion-file-test-XXXXXX"; + int temp_fd = mkstemp(temp_path); + assert(temp_fd >= 0); + close(temp_fd); + + int saved_stdin = dup(STDIN_FILENO); + assert(saved_stdin >= 0); + assert(close(STDIN_FILENO) == 0); + assert(file_write(temp_path, "abc", 3)); + assert(dup2(saved_stdin, STDIN_FILENO) == STDIN_FILENO); + close(saved_stdin); + + char *file_contents = file_read(temp_path); + assert(file_contents != NULL); + assert(strcmp(file_contents, "abc") == 0); + free(file_contents); + unlink(temp_path); + return 0; } From 351bb813f97011bc4fa22de59ca147481f399dd9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 20:32:59 +0000 Subject: [PATCH 13/14] fix: handle relative paths in file prepend helper Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- src/common/utils/file.c | 13 +++++++++++-- test/test_str.c | 13 +++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/common/utils/file.c b/src/common/utils/file.c index a3c85f7406..8cfc0c744d 100644 --- a/src/common/utils/file.c +++ b/src/common/utils/file.c @@ -155,7 +155,11 @@ bool file_write(const char *path, const char *str, uint32_t len) return false; written = write(fd, str, len); - if (written == -1 || (uint32_t)written != len) { + if (written == -1) { + close(fd); + return false; + } + if ((size_t)written != len) { close(fd); return false; } @@ -482,8 +486,13 @@ void file_add_line_to_beginning(const char *filename, const char *lineToAdd) } char tempPath[STR_MAX]; char *path = file_dirname(filename); - sprintf(tempPath, "%s/temp.txt", path); + int written = snprintf(tempPath, sizeof(tempPath), "%s%stemp.txt", path ? path : "", path ? "/" : ""); free(path); + if (written < 0 || (size_t)written >= sizeof(tempPath)) { + fclose(file); + print_debug("Temporary file path is too long"); + return; + } FILE *tempFile = fopen(tempPath, "w"); if (tempFile == NULL) { diff --git a/test/test_str.c b/test/test_str.c index c4187012d4..062ec70d0b 100644 --- a/test/test_str.c +++ b/test/test_str.c @@ -78,5 +78,18 @@ int main(void) free(file_contents); unlink(temp_path); + char relative_path[] = "onion-relative-XXXXXX"; + int relative_fd = mkstemp(relative_path); + assert(relative_fd >= 0); + assert(write(relative_fd, "world\n", 6) == 6); + close(relative_fd); + + file_add_line_to_beginning(relative_path, "hello\n"); + file_contents = file_read(relative_path); + assert(file_contents != NULL); + assert(strcmp(file_contents, "hello\nworld\n") == 0); + free(file_contents); + unlink(relative_path); + return 0; } From ca8ca77a9058a8f8f54609409cdbadfdc5a8888a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 20:33:56 +0000 Subject: [PATCH 14/14] test: restore stdin before asserting fd reuse case Co-authored-by: Amiga500 <16525337+Amiga500@users.noreply.github.com> --- test/test_str.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_str.c b/test/test_str.c index 062ec70d0b..e3d8892607 100644 --- a/test/test_str.c +++ b/test/test_str.c @@ -68,9 +68,10 @@ int main(void) int saved_stdin = dup(STDIN_FILENO); assert(saved_stdin >= 0); assert(close(STDIN_FILENO) == 0); - assert(file_write(temp_path, "abc", 3)); + int write_ok = file_write(temp_path, "abc", 3); assert(dup2(saved_stdin, STDIN_FILENO) == STDIN_FILENO); close(saved_stdin); + assert(write_ok); char *file_contents = file_read(temp_path); assert(file_contents != NULL);