diff --git a/src/stdlib/src/lib.rs b/src/stdlib/src/lib.rs
index 0a6016f9f12e197a24b9df142f406475209c08df..f88743581d81d1bc2ccd9b08574ce53076436acc 100644
--- a/src/stdlib/src/lib.rs
+++ b/src/stdlib/src/lib.rs
@@ -375,30 +375,35 @@ pub extern "C" fn mktemp(name: *mut c_char) -> *mut c_char {
         fn strlen(s: *const c_char) -> size_t;
     }
     let len = unsafe { strlen(name) };
-    let mut retries = 100;
-    let name_buf = unsafe { slice::from_raw_parts(name as *const u8, len as usize) }; 
-    let name_str = str::from_utf8(name_buf).unwrap_or("");
-    if len < 6 || !name_str.ends_with("XXXXXX") {
+    if len < 6 {
         unsafe { platform::errno = errno::EINVAL };
         unsafe { *name = 0 };
-        return name; 
-    } 
+        return name;
+    }
+    for i in len-6..len {
+        if unsafe { *name.offset(i as isize) } != b'X' as c_char {
+            unsafe { platform::errno = errno::EINVAL };
+            unsafe { *name = 0 };
+            return name;
+        }
+    }
 
     let mut rng = JitterRng::new_with_timer(get_nstime);
     rng.test_timer();
 
+    let mut retries = 100;
     loop {
         let mut char_iter = iter::repeat(())
         .map(|()| rng.sample(Alphanumeric))
-        .take(6); 
+        .take(6);
         unsafe {
             for (i,c) in char_iter.enumerate() {
-                *name.offset(len as isize-i as isize) = c as c_char
+                *name.offset(len as isize - i as isize - 1) = c as c_char
             }
         }
 
         unsafe {
-            let mut st: stat = mem::uninitialized(); 
+            let mut st: stat = mem::uninitialized();
             if platform::stat(name, &mut st) != 0 {
                 if platform::errno != ENOENT { *name = 0; }
                 return name;