diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs
index c795ee160b0500286bd194f51f5f655aec48d65c..c97302b92bf44cefacf6f081c32275c5dc8ecb70 100644
--- a/src/string/src/lib.rs
+++ b/src/string/src/lib.rs
@@ -324,33 +324,9 @@ pub unsafe extern "C" fn strstr(s1: *const c_char, s2: *const c_char) -> *mut c_
 
 #[no_mangle]
 pub extern "C" fn strtok(s1: *mut c_char, delimiter: *const c_char) -> *mut c_char {
-    // Loosely based on GLIBC implementation
+    static mut HAYSTACK: *mut c_char = ptr::null_mut();
     unsafe {
-        static mut HAYSTACK: *mut c_char = ptr::null_mut();
-        if !s1.is_null() {
-            HAYSTACK = s1;
-        } else if HAYSTACK.is_null() {
-            return ptr::null_mut();
-        }
-
-        // Skip past any extra delimiter left over from previous call
-        HAYSTACK = HAYSTACK.add(strspn(HAYSTACK, delimiter));
-        if *HAYSTACK == 0 {
-            HAYSTACK = ptr::null_mut();
-            return ptr::null_mut();
-        }
-
-        // Build token by injecting null byte into delimiter
-        let token = HAYSTACK;
-        HAYSTACK = strpbrk(token, delimiter);
-        if !HAYSTACK.is_null() {
-            HAYSTACK.write(0);
-            HAYSTACK = HAYSTACK.add(1);
-        } else {
-            HAYSTACK = ptr::null_mut();
-        }
-
-        return token;
+        return strtok_r(s1, delimiter, &mut HAYSTACK);
     }
 }