From d6593503c64c42c7ce7b46716c26338856f1664c Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Mon, 13 Feb 2006 17:27:50 +0000 Subject: 2006-02-13 Jeff Johnston David Carne * libc/string/strndup_r.c (_strndup_r): Use strnlen logic instead of strlen to determine number of bytes to copy. * libc/string/strnlen.c (strnlen): Fix so check for max limit occurs before looking at storage location. --- newlib/libc/string/strndup_r.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'newlib/libc/string/strndup_r.c') diff --git a/newlib/libc/string/strndup_r.c b/newlib/libc/string/strndup_r.c index 86d9eec44..2acf63dec 100644 --- a/newlib/libc/string/strndup_r.c +++ b/newlib/libc/string/strndup_r.c @@ -2,16 +2,22 @@ #include #include -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - char * _DEFUN (_strndup_r, (reent_ptr, str, n), struct _reent *reent_ptr _AND _CONST char *str _AND size_t n) { - size_t len = MIN(strlen (str), n); - char *copy = _malloc_r (reent_ptr, len + 1); + _CONST char *ptr = str; + size_t len; + char *copy; + + while (n-- > 0 && *ptr) + ptr++; + + len = ptr - str; + + copy = _malloc_r (reent_ptr, len + 1); if (copy) { memcpy (copy, str, len); -- cgit v1.2.3