ucode: fix reusing the current environment in uloop.process()
authorFelix Fietkau <[email protected]>
Wed, 8 Oct 2025 17:50:20 +0000 (19:50 +0200)
committerFelix Fietkau <[email protected]>
Wed, 8 Oct 2025 17:50:29 +0000 (19:50 +0200)
Signed-off-by: Felix Fietkau <[email protected]>
package/utils/ucode/patches/110-uloop-allow-reusing-the-existing-environment.patch [new file with mode: 0644]

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 (file)
index 0000000..867b434
--- /dev/null
@@ -0,0 +1,57 @@
+From: Felix Fietkau <[email protected]>
+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 <[email protected]>
+---
+
+--- 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);