From 9c778c39e7eaa6fac9357af3e58765777915faf5 Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Mon, 26 Dec 2022 14:01:51 +0000 Subject: [PATCH 1/7] Remove unused parameter. --- lib/serve_2.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/serve_2.c b/lib/serve_2.c index 6f67af4424..921254d273 100644 --- a/lib/serve_2.c +++ b/lib/serve_2.c @@ -1302,7 +1302,6 @@ serve_audit_log( static char ** filter_lang_environ( - const struct ejudge_cfg *config, serve_state_t state, const struct section_problem_data *prob, const struct section_language_data *lang, @@ -1475,10 +1474,10 @@ serve_compile_request( } if (prob && prob->lang_compiler_env && lang) { - comp_env_mem_2 = filter_lang_environ(config, state, prob, lang, NULL, prob->lang_compiler_env); + comp_env_mem_2 = filter_lang_environ(state, prob, lang, NULL, prob->lang_compiler_env); } if (prob && lang && prob->lang_compiler_container_options) { - compiler_container_options = filter_lang_environ(config, state, prob, lang, NULL, prob->lang_compiler_container_options); + compiler_container_options = filter_lang_environ(state, prob, lang, NULL, prob->lang_compiler_container_options); } if (compiler_env && compiler_env[0] && comp_env_mem_2 && comp_env_mem_2[0]) { From 40a166a4d625e399296690fa7930bc82c8590bce Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Mon, 26 Dec 2022 17:43:49 +0000 Subject: [PATCH 2/7] Extract function env_for_lang. --- lib/serve_2.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/serve_2.c b/lib/serve_2.c index 921254d273..7e139bf1eb 100644 --- a/lib/serve_2.c +++ b/lib/serve_2.c @@ -1300,6 +1300,16 @@ serve_audit_log( fclose(f); } +static char* +env_for_lang(char* env, const char* lang) +{ + size_t llen = strlen(lang); + if (!strncmp(env, lang, llen) && env[llen] == '=') { + return env + llen + 1; + } + return NULL; +} + static char ** filter_lang_environ( serve_state_t state, @@ -1310,20 +1320,18 @@ filter_lang_environ( { int count = 0, i, llen, j = 0; char **env = NULL; + const char *lang_env; llen = strlen(lang->short_name); for (i = 0; environ[i]; ++i) { - if (environ[i][0] == '*' && environ[i][1] == '=') { - ++count; - } else if (strlen(environ[i]) > llen && !strncmp(lang->short_name, environ[i], llen) && environ[i][llen] == '=') { + if (env_for_lang(environ[i], "*") || env_for_lang(environ[i], lang->short_name)) { ++count; } } XCALLOC(env, count + 1); for (i = 0; environ[i]; ++i) { - if (environ[i][0] == '*' && environ[i][1] == '=') { - env[j++] = prepare_varsubst(state, environ[i] + 2, 0, prob, lang, tester); - } else if (strlen(environ[i]) > llen && !strncmp(lang->short_name, environ[i], llen) && environ[i][llen] == '=') { - env[j++] = prepare_varsubst(state, environ[i] + llen + 1, 0, prob, lang, tester); + if ((lang_env = env_for_lang(environ[i], "*")) || + (lang_env = env_for_lang(environ[i], lang->short_name))) { + env[j++] = prepare_varsubst(state, lang_env, 0, prob, lang, tester); } } return env; From 5ee852216d289b7e4f7a43b24bdef418b4679b12 Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Mon, 26 Dec 2022 19:00:58 +0000 Subject: [PATCH 3/7] Add Check-based unittest. --- .gitignore | 1 + files.make | 3 +++ lib/serve_2_ut.c | 39 +++++++++++++++++++++++++++++++++++++++ main.unix.make | 5 +++++ 4 files changed, 48 insertions(+) create mode 100644 lib/serve_2_ut.c diff --git a/.gitignore b/.gitignore index d297746157..0c21893dd4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ uudecode serve-control new-client newrevinfo +lib_ut ej-batch ej-compile ej-compile-control diff --git a/files.make b/files.make index 2937ce5c61..c76b34e0c2 100644 --- a/files.make +++ b/files.make @@ -118,6 +118,9 @@ REUSE_CFILES=\ reuse/reuse_xstrmerge2.c\ reuse/reuse_xstrmerge3.c +COMMON_UT_CFILES=\ + lib/serve_2_ut.c + COMMON_CFILES=\ lib/agent_client_ssh.c\ lib/allowed_list.c\ diff --git a/lib/serve_2_ut.c b/lib/serve_2_ut.c new file mode 100644 index 0000000000..87336f48dc --- /dev/null +++ b/lib/serve_2_ut.c @@ -0,0 +1,39 @@ +#include +#include + +START_TEST(test_filter_env) +{ + ck_assert(0); +} +END_TEST + +Suite * serve_2_suite(void) +{ + Suite *s; + TCase *tc_core; + + s = suite_create("Serve_2"); + + /* Core test case */ + tc_core = tcase_create("Core"); + + tcase_add_test(tc_core, test_filter_env); + suite_add_tcase(s, tc_core); + + return s; +} + +int main(void) +{ + int number_failed; + Suite *s; + SRunner *sr; + + s = serve_2_suite(); + sr = srunner_create(s); + + srunner_run_all(sr, CK_NORMAL); + number_failed = srunner_ntests_failed(sr); + srunner_free(sr); + return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/main.unix.make b/main.unix.make index d327f19f52..47dc4a6277 100644 --- a/main.unix.make +++ b/main.unix.make @@ -40,6 +40,8 @@ CC=gcc LD=gcc EXPAT_LIB=-lexpat +COMMON_UT_OBJECTS=$(COMMON_UT_CFILES:.c=.o) libcommon.a + C_CFILES=bin/ej-compile.c version.c C_OBJECTS=$(C_CFILES:.c=.o) libcommon.a libplatform.a libcommon.a @@ -310,6 +312,9 @@ suid_install : ${SUIDBINTARGETS} ejudge-suid-setup ej-compile-control suid_bins : ${SUIDBINTARGETS} +lib_ut$(EXESFX) : $(COMMON_UT_OBJECTS) + $(LD) $(LDFLAGS) $(COMMON_UT_OBJECTS) -o $@ -lcheck -lm -lsubunit + ej-compile$(EXESFX) : $(C_OBJECTS) $(LD) $(LDFLAGS) $(C_OBJECTS) -pthread -o $@ $(LDLIBS) ${EXPAT_LIB} ${LIBZIP} ${LIBUUID} ${LIBLZMA} From 6883a96378ad6ab4d75c9ae22088b095d13a1a87 Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Tue, 27 Dec 2022 08:07:14 +0000 Subject: [PATCH 4/7] Build lib_ut with necessary libs. --- files.make | 3 ++- lib/serve_2.c | 7 +++---- lib/serve_2_ut.c | 22 +++++++++++++++++++++- main.unix.make | 4 ++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/files.make b/files.make index c76b34e0c2..b2e77e1f81 100644 --- a/files.make +++ b/files.make @@ -119,7 +119,8 @@ REUSE_CFILES=\ reuse/reuse_xstrmerge3.c COMMON_UT_CFILES=\ - lib/serve_2_ut.c + lib/serve_2_ut.c\ + version.c COMMON_CFILES=\ lib/agent_client_ssh.c\ diff --git a/lib/serve_2.c b/lib/serve_2.c index 7e139bf1eb..8a32f0696d 100644 --- a/lib/serve_2.c +++ b/lib/serve_2.c @@ -1310,7 +1310,7 @@ env_for_lang(char* env, const char* lang) return NULL; } -static char ** +char ** filter_lang_environ( serve_state_t state, const struct section_problem_data *prob, @@ -1318,10 +1318,9 @@ filter_lang_environ( const struct section_tester_data *tester, char **environ) { - int count = 0, i, llen, j = 0; + int count = 0, i, j = 0; char **env = NULL; - const char *lang_env; - llen = strlen(lang->short_name); + char *lang_env; for (i = 0; environ[i]; ++i) { if (env_for_lang(environ[i], "*") || env_for_lang(environ[i], lang->short_name)) { ++count; diff --git a/lib/serve_2_ut.c b/lib/serve_2_ut.c index 87336f48dc..34457bec28 100644 --- a/lib/serve_2_ut.c +++ b/lib/serve_2_ut.c @@ -1,9 +1,29 @@ #include #include +#include "ejudge/serve_state.h" +#include "ejudge/prepare.h" + +char ** +filter_lang_environ( + serve_state_t state, + const struct section_problem_data *prob, + const struct section_language_data *lang, + const struct section_tester_data *tester, + char **environ); + START_TEST(test_filter_env) { - ck_assert(0); + struct serve_state state = {0}; + struct section_problem_data prob = {0}; + struct section_language_data lang = {0}; + struct section_tester_data tester = {0}; + char *environ[] = { + "a=1", + "b=2", + NULL + }; + char **newenv = filter_lang_environ(&state, &prob, &lang, &tester, environ); } END_TEST diff --git a/main.unix.make b/main.unix.make index 47dc4a6277..c15518668d 100644 --- a/main.unix.make +++ b/main.unix.make @@ -40,7 +40,7 @@ CC=gcc LD=gcc EXPAT_LIB=-lexpat -COMMON_UT_OBJECTS=$(COMMON_UT_CFILES:.c=.o) libcommon.a +COMMON_UT_OBJECTS=$(COMMON_UT_CFILES:.c=.o) libcommon.a libuserlist_clnt.a libplatform.a libcommon.a C_CFILES=bin/ej-compile.c version.c C_OBJECTS=$(C_CFILES:.c=.o) libcommon.a libplatform.a libcommon.a @@ -313,7 +313,7 @@ suid_install : ${SUIDBINTARGETS} ejudge-suid-setup ej-compile-control suid_bins : ${SUIDBINTARGETS} lib_ut$(EXESFX) : $(COMMON_UT_OBJECTS) - $(LD) $(LDFLAGS) $(COMMON_UT_OBJECTS) -o $@ -lcheck -lm -lsubunit + $(LD) $(LDFLAGS) $(COMMON_UT_OBJECTS) -o $@ -lcheck -lsubunit $(LDLIBS) ${EXPAT_LIB} ${LIBUUID} ej-compile$(EXESFX) : $(C_OBJECTS) $(LD) $(LDFLAGS) $(C_OBJECTS) -pthread -o $@ $(LDLIBS) ${EXPAT_LIB} ${LIBZIP} ${LIBUUID} ${LIBLZMA} From 7e692669a810e5cef161bd41a496f1c0aa3dfc3a Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Tue, 27 Dec 2022 08:15:59 +0000 Subject: [PATCH 5/7] Add actual assertions. --- lib/serve_2_ut.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/serve_2_ut.c b/lib/serve_2_ut.c index 34457bec28..506f8d8282 100644 --- a/lib/serve_2_ut.c +++ b/lib/serve_2_ut.c @@ -16,14 +16,20 @@ START_TEST(test_filter_env) { struct serve_state state = {0}; struct section_problem_data prob = {0}; - struct section_language_data lang = {0}; + struct section_language_data lang = { + .short_name = "gcc-32", + }; struct section_tester_data tester = {0}; char *environ[] = { - "a=1", - "b=2", + "gcc-32=a=1", + "gcc=b=2", + "*=c=3", NULL }; char **newenv = filter_lang_environ(&state, &prob, &lang, &tester, environ); + ck_assert_str_eq(newenv[0], "a=1"); + ck_assert_str_eq(newenv[1], "c=3"); + ck_assert(newenv[2] == NULL); } END_TEST From 748684047a7f6664cab66f74317c005d12d24d59 Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Tue, 27 Dec 2022 08:27:11 +0000 Subject: [PATCH 6/7] Free allocated memory. --- lib/serve_2_ut.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/serve_2_ut.c b/lib/serve_2_ut.c index 506f8d8282..77478660b9 100644 --- a/lib/serve_2_ut.c +++ b/lib/serve_2_ut.c @@ -30,6 +30,9 @@ START_TEST(test_filter_env) ck_assert_str_eq(newenv[0], "a=1"); ck_assert_str_eq(newenv[1], "c=3"); ck_assert(newenv[2] == NULL); + free(newenv[0]); + free(newenv[1]); + free(newenv); } END_TEST From 1e1249d733bbfa03f19c38f4fba1d65f0c1f159b Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Tue, 27 Dec 2022 08:43:57 +0000 Subject: [PATCH 7/7] Test variable substitution. --- lib/serve_2_ut.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/serve_2_ut.c b/lib/serve_2_ut.c index 77478660b9..fccec04dca 100644 --- a/lib/serve_2_ut.c +++ b/lib/serve_2_ut.c @@ -15,7 +15,9 @@ filter_lang_environ( START_TEST(test_filter_env) { struct serve_state state = {0}; - struct section_problem_data prob = {0}; + struct section_problem_data prob = { + .short_name = "collatz", + }; struct section_language_data lang = { .short_name = "gcc-32", }; @@ -23,12 +25,12 @@ START_TEST(test_filter_env) char *environ[] = { "gcc-32=a=1", "gcc=b=2", - "*=c=3", + "*=probname=${problem.short_name}", NULL }; char **newenv = filter_lang_environ(&state, &prob, &lang, &tester, environ); ck_assert_str_eq(newenv[0], "a=1"); - ck_assert_str_eq(newenv[1], "c=3"); + ck_assert_str_eq(newenv[1], "probname=collatz"); ck_assert(newenv[2] == NULL); free(newenv[0]); free(newenv[1]);