openwrt-mirror/package/utils/ucode/patches/110-uloop-allow-reusing-the-existing-environment.patch
Felix Fietkau 7418c2d89b ucode: fix reusing the current environment in uloop.process()
Signed-off-by: Felix Fietkau <nbd@nbd.name>
2025-10-08 19:50:29 +02:00

58 lines
1.5 KiB
Diff

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);