summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2006-02-13 17:27:50 +0000
committerJeff Johnston <jjohnstn@redhat.com>2006-02-13 17:27:50 +0000
commitd6593503c64c42c7ce7b46716c26338856f1664c (patch)
tree38fbd34d431e1466704236159f80e301993a80a1
parent3801e59ad881f230b7b71bb580dff32d07ba2e53 (diff)
downloadcygnal-d6593503c64c42c7ce7b46716c26338856f1664c.tar.gz
cygnal-d6593503c64c42c7ce7b46716c26338856f1664c.tar.bz2
cygnal-d6593503c64c42c7ce7b46716c26338856f1664c.zip
2006-02-13 Jeff Johnston <jjohnstn@redhat.com>
David Carne <davidcarne@gmail.com> * 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.
-rw-r--r--newlib/ChangeLog8
-rw-r--r--newlib/libc/string/strndup_r.c14
-rw-r--r--newlib/libc/string/strnlen.c2
3 files changed, 19 insertions, 5 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 8f0039813..eb817653f 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,11 @@
+2006-02-13 Jeff Johnston <jjohnstn@redhat.com>
+ David Carne <davidcarne@gmail.com>
+
+ * 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.
+
2006-02-07 Paul Brook <paul@codesourcery.com>
* libc/machine/arm/setjmp.S: Add Thumb-2 support.
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 <stdlib.h>
#include <string.h>
-#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);
diff --git a/newlib/libc/string/strnlen.c b/newlib/libc/string/strnlen.c
index 92826eeb2..ed60e9371 100644
--- a/newlib/libc/string/strnlen.c
+++ b/newlib/libc/string/strnlen.c
@@ -42,7 +42,7 @@ _DEFUN (strnlen, (str, n),
{
_CONST char *start = str;
- while (*str && n-- > 0)
+ while (n-- > 0 && *str)
str++;
return str - start;