mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2026-01-28 03:37:17 +01:00
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
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:
parent
987b1484a6
commit
7418c2d89b
1 changed files with 57 additions and 0 deletions
|
|
@ -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);
|
||||
|
||||
Loading…
Add table
Reference in a new issue