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