about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2014-09-25 13:01:32 -0700
committerBrian Anderson <banderson@mozilla.com>2014-09-26 10:17:03 -0700
commit3b3d7021e4a2bccace8816bb24eec33eac09c9f2 (patch)
treeac28ac0674f39528c2ce53ced6fc8faa616a4e4b
parenta52eaaa996a7edeb699a756f755ad4b8c23dc9df (diff)
downloadrust-3b3d7021e4a2bccace8816bb24eec33eac09c9f2.tar.gz
rust-3b3d7021e4a2bccace8816bb24eec33eac09c9f2.zip
Add test for #13259. Closes #13259 and #14742
-rw-r--r--src/test/run-pass/issue-13259-windows-tcb-trash.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/test/run-pass/issue-13259-windows-tcb-trash.rs b/src/test/run-pass/issue-13259-windows-tcb-trash.rs
new file mode 100644
index 00000000000..94953730df8
--- /dev/null
+++ b/src/test/run-pass/issue-13259-windows-tcb-trash.rs
@@ -0,0 +1,28 @@
+extern crate libc;
+use libc::{c_void, LPVOID, DWORD};
+use libc::types::os::arch::extra::LPWSTR;
+
+extern "system" {
+    fn FormatMessageW(flags: DWORD,
+                      lpSrc: LPVOID,
+                      msgId: DWORD,
+                      langId: DWORD,
+                      buf: LPWSTR,
+                      nsize: DWORD,
+                      args: *const c_void)
+                      -> DWORD;
+}
+
+fn test() {
+    let mut buf: [u16, ..50] = [0, ..50];
+    let ret = unsafe {
+        FormatMessageW(0x1000, 0 as *mut c_void, 1, 0x400,
+                       buf.as_mut_ptr(), buf.len() as u32, 0 as *const c_void)
+    };
+    // On some 32-bit Windowses (Win7-8 at least) this will fail with segmented
+    // stacks taking control of pvArbitrary
+    assert!(ret != 0);
+}
+fn main() {
+    test()
+}
\ No newline at end of file