From 1ebd8a3d723291e7f120b3c95b2e5141c9ef93b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Miku=C5=82a?= <matti@marinelayer.io> Date: Wed, 24 Apr 2019 17:32:06 +0200 Subject: [PATCH] Handle zero length for strerror_r --- src/header/string/mod.rs | 6 ++++-- tests/error.c | 4 ++++ tests/expected/error.stdout | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs index 8c8acb216..c402707f3 100644 --- a/src/header/string/mod.rs +++ b/src/header/string/mod.rs @@ -235,8 +235,10 @@ pub unsafe extern "C" fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: siz let len = strlen(msg); if len >= buflen { - memcpy(buf as *mut c_void, msg as *const c_void, buflen - 1); - *buf.add(buflen - 1) = 0; + if buflen != 0 { + memcpy(buf as *mut c_void, msg as *const c_void, buflen - 1); + *buf.add(buflen - 1) = 0; + } return ERANGE as c_int; } memcpy(buf as *mut c_void, msg as *const c_void, len + 1); diff --git a/tests/error.c b/tests/error.c index bb613b922..5cbe10385 100644 --- a/tests/error.c +++ b/tests/error.c @@ -19,4 +19,8 @@ int main(void) { char buf2[3]; int ret2 = strerror_r(err, buf2, 3); printf("errno: %d = %s, return: %d\n", err, buf2, ret2); + + char buf3[256]; + int ret3 = strerror_r(err, buf3, 0); + printf("errno: %d = %s, return: %d\n", err, buf3, ret3); } diff --git a/tests/expected/error.stdout b/tests/expected/error.stdout index d1c1a211f..4e744d1bf 100644 --- a/tests/expected/error.stdout +++ b/tests/expected/error.stdout @@ -1,3 +1,4 @@ errno: 2 = No such file or directory errno: 2 = No such file or directory, return: 0 errno: 2 = No, return: 34 +errno: 2 = , return: 34 -- GitLab