aboutsummaryrefslogtreecommitdiff
path: root/libiberty/strndup.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2016-11-30 14:50:43 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2016-11-30 14:50:43 +0000
commite613205cefe50e429bafba2bc4cb71126b1f36df (patch)
treef30b1f41724d3288f8bdba58298d4d1aecd8960d /libiberty/strndup.c
parente6383ae7a73164277026cf815315e39f281e6aca (diff)
downloadgcc-e613205cefe50e429bafba2bc4cb71126b1f36df.zip
gcc-e613205cefe50e429bafba2bc4cb71126b1f36df.tar.gz
gcc-e613205cefe50e429bafba2bc4cb71126b1f36df.tar.bz2
libiberty: avoid reading past end of buffer in strndup/xstrndup (PR c/78498)
gcc/ChangeLog: PR c/78498 * selftest.c (selftest::assert_strndup_eq): New function. (selftest::test_strndup): New function. (selftest::test_libiberty): New function. (selftest::selftest_c_tests): Call test_libiberty. gcc/testsuite/ChangeLog: PR c/78498 * gcc.dg/format/pr78494.c: New test case. libiberty/ChangeLog: PR c/78498 * strndup.c (strlen): Delete decl. (strnlen): Add decl. (strndup): Call strnlen rather than strlen. * xstrndup.c (xstrndup): Likewise. From-SVN: r243030
Diffstat (limited to 'libiberty/strndup.c')
-rw-r--r--libiberty/strndup.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/libiberty/strndup.c b/libiberty/strndup.c
index 9e9b4e2..4556b96 100644
--- a/libiberty/strndup.c
+++ b/libiberty/strndup.c
@@ -33,7 +33,7 @@ memory was available. The result is always NUL terminated.
#include "ansidecl.h"
#include <stddef.h>
-extern size_t strlen (const char*);
+extern size_t strnlen (const char *s, size_t maxlen);
extern PTR malloc (size_t);
extern PTR memcpy (PTR, const PTR, size_t);
@@ -41,10 +41,7 @@ char *
strndup (const char *s, size_t n)
{
char *result;
- size_t len = strlen (s);
-
- if (n < len)
- len = n;
+ size_t len = strnlen (s, n);
result = (char *) malloc (len + 1);
if (!result)