From 629c20f097ed158233d65ca5ffc62e1c887709e6 Mon Sep 17 00:00:00 2001
From: Alex Lyon <arcterus@mail.com>
Date: Wed, 7 Mar 2018 17:46:00 -0800
Subject: [PATCH] string: ensure resulting string has NUL byte

---
 src/errno/src/lib.rs  | 2 +-
 src/string/src/lib.rs | 9 +++++----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/errno/src/lib.rs b/src/errno/src/lib.rs
index 8a28cb6d..3cb5cd03 100644
--- a/src/errno/src/lib.rs
+++ b/src/errno/src/lib.rs
@@ -162,5 +162,5 @@ pub enum Errno {
     // Operation would block (may be the same value as [EAGAIN])
     EWOULDBLOCK,
     // Cross-device link
-    EXDEV
+    EXDEV,
 }
diff --git a/src/string/src/lib.rs b/src/string/src/lib.rs
index 744e5411..f8a6f425 100644
--- a/src/string/src/lib.rs
+++ b/src/string/src/lib.rs
@@ -2,9 +2,9 @@
 
 #![no_std]
 
+extern crate errno;
 extern crate platform;
 extern crate stdlib;
-extern crate errno;
 
 use platform::types::*;
 use errno::*;
@@ -94,10 +94,10 @@ pub unsafe extern "C" fn strdup(s1: *const c_char) -> *mut c_char {
 
 #[no_mangle]
 pub unsafe extern "C" fn strndup(s1: *const c_char, size: usize) -> *mut c_char {
-    // the "+ 1" is to account for the NUL byte
-    let len = strnlen(s1, size) + 1;
+    let len = strnlen(s1, size);
 
-    let buffer = stdlib::malloc(len) as *mut c_char;
+    // the "+ 1" is to account for the NUL byte
+    let buffer = stdlib::malloc(len + 1) as *mut c_char;
     if buffer.is_null() {
         platform::errno = Errno::ENOMEM as c_int;
     } else {
@@ -105,6 +105,7 @@ pub unsafe extern "C" fn strndup(s1: *const c_char, size: usize) -> *mut c_char
         for i in 0..len as isize {
             *buffer.offset(i) = *s1.offset(i);
         }
+        *buffer.offset(len as isize) = 0;
     }
 
     buffer
-- 
GitLab