From: Felix Fietkau 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 --- --- 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);