ucode: fix reusing the current environment in uloop.process()
Some checks are pending
Build all core packages / Build all core packages for selected target (push) Waiting to run

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2025-10-08 19:50:20 +02:00
parent 987b1484a6
commit 7418c2d89b

View file

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