From: Felix Fietkau Date: Wed, 8 Oct 2025 17:50:20 +0000 (+0200) Subject: ucode: fix reusing the current environment in uloop.process() X-Git-Tag: v25.12.0-rc1~979 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7418c2d89b1c2bda3b14679abbcc45c716e469eb;p=thirdparty%2Fopenwrt.git ucode: fix reusing the current environment in uloop.process() Signed-off-by: Felix Fietkau --- diff --git a/package/utils/ucode/patches/110-uloop-allow-reusing-the-existing-environment.patch b/package/utils/ucode/patches/110-uloop-allow-reusing-the-existing-environment.patch new file mode 100644 index 00000000000..867b434789c --- /dev/null +++ b/package/utils/ucode/patches/110-uloop-allow-reusing-the-existing-environment.patch @@ -0,0 +1,57 @@ +From: Felix Fietkau +Date: Wed, 8 Oct 2025 19:11:46 +0200 +Subject: [PATCH] uloop: allow reusing the existing environment + +When passing null as environment argument, reuse existing environ. +This makes it possible to avoid having to duplicate and convert it +by passing the output of getenv(). + +Signed-off-by: Felix Fietkau +--- + +--- a/lib/uloop.c ++++ b/lib/uloop.c +@@ -1016,7 +1016,22 @@ uc_uloop_process(uc_vm_t *vm, size_t nar + + if (pid == 0) { + argp = calloc(ucv_array_length(arguments) + 2, sizeof(char *)); +- envp = calloc(ucv_object_length(env_arg) + 1, sizeof(char *)); ++ envp = environ; ++ ++ if (env_arg) { ++ envp = calloc(ucv_object_length(env_arg) + 1, sizeof(char *)); ++ i = 0; ++ ucv_object_foreach(env_arg, envk, envv) { ++ buf = xprintbuf_new(); ++ ++ ucv_stringbuf_printf(buf, "%s=", envk); ++ ucv_to_stringbuf(vm, buf, envv, false); ++ ++ envp[i++] = buf->buf; ++ ++ free(buf); ++ } ++ } + + if (!argp || !envp) + _exit(-1); +@@ -1026,19 +1041,6 @@ uc_uloop_process(uc_vm_t *vm, size_t nar + for (i = 0; i < ucv_array_length(arguments); i++) + argp[i+1] = ucv_to_string(vm, ucv_array_get(arguments, i)); + +- i = 0; +- +- ucv_object_foreach(env_arg, envk, envv) { +- buf = xprintbuf_new(); +- +- ucv_stringbuf_printf(buf, "%s=", envk); +- ucv_to_stringbuf(vm, buf, envv, false); +- +- envp[i++] = buf->buf; +- +- free(buf); +- } +- + execvpe((const char *)ucv_string_get(executable), + (char * const *)argp, (char * const *)envp); +