diff options
| author | Felix Fietkau | 2025-10-08 17:50:20 +0000 |
|---|---|---|
| committer | Felix Fietkau | 2025-10-08 17:50:29 +0000 |
| commit | 7418c2d89b1c2bda3b14679abbcc45c716e469eb (patch) | |
| tree | 0b9d59c32eb9ca14c8469d5757add0bc683166f5 | |
| parent | 987b1484a6a02770566ccb1b4d2f09e06d3ba04e (diff) | |
| download | openwrt-7418c2d89b1c2bda3b14679abbcc45c716e469eb.tar.gz | |
ucode: fix reusing the current environment in uloop.process()
Signed-off-by: Felix Fietkau <nbd@nbd.name>
| -rw-r--r-- | package/utils/ucode/patches/110-uloop-allow-reusing-the-existing-environment.patch | 57 |
1 files changed, 57 insertions, 0 deletions
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 0000000000..867b434789 --- /dev/null +++ b/package/utils/ucode/patches/110-uloop-allow-reusing-the-existing-environment.patch @@ -0,0 +1,57 @@ +From: Felix Fietkau <nbd@nbd.name> +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 <nbd@nbd.name> +--- + +--- 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); + |