about summary refs log tree commit diff
path: root/tests/ui/env-funky-keys.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/env-funky-keys.rs')
-rw-r--r--tests/ui/env-funky-keys.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/tests/ui/env-funky-keys.rs b/tests/ui/env-funky-keys.rs
new file mode 100644
index 00000000000..46e20d8c61f
--- /dev/null
+++ b/tests/ui/env-funky-keys.rs
@@ -0,0 +1,43 @@
+// run-pass
+// Ignore this test on Android, because it segfaults there.
+
+// ignore-android
+// ignore-windows
+// ignore-emscripten no execve
+// ignore-sgx no execve
+// ignore-vxworks no execve
+// ignore-fuchsia no 'execve'
+// no-prefer-dynamic
+
+#![feature(rustc_private)]
+
+extern crate libc;
+
+use libc::c_char;
+use libc::execve;
+use std::env;
+use std::ffi::CString;
+use std::os::unix::prelude::*;
+use std::ptr;
+
+fn main() {
+    if env::args_os().count() == 2 {
+        for (key, value) in env::vars_os() {
+            panic!("found env value {:?} {:?}", key, value);
+        }
+        return;
+    }
+
+    let current_exe = CString::new(env::current_exe()
+                                       .unwrap()
+                                       .as_os_str()
+                                       .as_bytes()).unwrap();
+    let new_env_var = CString::new("FOOBAR").unwrap();
+    let filename: *const c_char = current_exe.as_ptr();
+    let argv: &[*const c_char] = &[filename, filename, ptr::null()];
+    let envp: &[*const c_char] = &[new_env_var.as_ptr(), ptr::null()];
+    unsafe {
+        execve(filename, &argv[0], &envp[0]);
+    }
+    panic!("execve failed");
+}