summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--lib.c9
-rw-r--r--tests/custom/99_bugs/46_getenv_destroys_environ13
2 files changed, 18 insertions, 4 deletions
diff --git a/lib.c b/lib.c
index e814f49..54ff354 100644
--- a/lib.c
+++ b/lib.c
@@ -854,21 +854,22 @@ uc_getenv(uc_vm_t *vm, size_t nargs)
{
uc_value_t *key = uc_fn_arg(0), *rv = NULL;
extern char **environ;
+ char **env = environ;
char *k, *v;
if (!key) {
rv = ucv_object_new(vm);
- while (*environ) {
- v = strchr(*environ, '=');
+ while (*env) {
+ v = strchr(*env, '=');
if (v) {
- xasprintf(&k, "%.*s", (int)(v - *environ), *environ);
+ xasprintf(&k, "%.*s", (int)(v - *env), *env);
ucv_object_add(rv, k, ucv_string_new(v + 1));
free(k);
}
- environ++;
+ env++;
}
}
else if (ucv_type(key) == UC_STRING) {
diff --git a/tests/custom/99_bugs/46_getenv_destroys_environ b/tests/custom/99_bugs/46_getenv_destroys_environ
new file mode 100644
index 0000000..1879dee
--- /dev/null
+++ b/tests/custom/99_bugs/46_getenv_destroys_environ
@@ -0,0 +1,13 @@
+A call to getenv() without parameters destroys environ, and subsequent calls
+to getenv() (with or without parameter) return nothing.
+
+-- Testcase --
+{%
+ getenv();
+ print(length(getenv()) > 0, '\n');
+%}
+-- End --
+
+-- Expect stdout --
+true
+-- End --