summaryrefslogtreecommitdiff
path: root/string
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-09-23 03:57:55 +0000
committerRoland McGrath <roland@gnu.org>2002-09-23 03:57:55 +0000
commitdf075e0920223f12ffb8d0a0e54c9d5db181ee76 (patch)
treef1ae67559df27d65576ccf4c5b6e0e1850a7af69 /string
parentda5ad344ff9da70f46c117e51d860d98a3d3e576 (diff)
* string/bug-stpncpy-offend.c: New file.
* string/Makefile (tests): Add it.
Diffstat (limited to 'string')
-rw-r--r--string/Makefile4
-rw-r--r--string/bug-stpncpy-offend.c53
2 files changed, 55 insertions, 2 deletions
diff --git a/string/Makefile b/string/Makefile
index 5d5b09e861..b0f55718b7 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-1999, 2000, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1991-1999,2000,2001,2002 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -48,7 +48,7 @@ o-objects.ob := memcpy.o memset.o memchr.o
tests := tester inl-tester noinl-tester testcopy test-ffs \
tst-strlen stratcliff tst-svc tst-inlcall \
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
- tst-strtok tst-strxfrm bug-strcoll1
+ tst-strtok tst-strxfrm bug-strcoll1 bug-stpncpy-offend
distribute := memcopy.h pagecopy.h tst-svc.expect
diff --git a/string/bug-stpncpy-offend.c b/string/bug-stpncpy-offend.c
new file mode 100644
index 0000000000..3a782f7cd7
--- /dev/null
+++ b/string/bug-stpncpy-offend.c
@@ -0,0 +1,53 @@
+/* Test program for stpncpy reading off the end of the source string. */
+
+#include <string.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+#include <test-skeleton.c>
+
+static int
+do_test (void)
+{
+ /* We get two pages of memory and then protect the second one so
+ we are sure to fault if we access past the end of the first page.
+ Then we test the odd-size string ending just on the page boundary. */
+
+ static const char test_string[] = "Seven.";
+ const size_t pagesz = getpagesize ();
+ char *buf = mmap (NULL, pagesz * 2,
+ PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
+ char *s1, *r;
+ volatile size_t len = sizeof test_string;
+
+ if (buf == MAP_FAILED)
+ {
+ perror ("mmap");
+ return 1;
+ }
+ if (mprotect (buf + pagesz, pagesz, PROT_NONE) != 0)
+ {
+ perror ("mprotect");
+ return 2;
+ }
+
+ s1 = buf + pagesz - sizeof test_string;
+ memcpy (s1, test_string, sizeof test_string);
+
+ r = stpncpy (buf, s1, len);
+ if (r != buf + len - 1)
+ {
+ printf ("r = buf + %d != %zu\n", r - buf, len - 1);
+ return 3;
+ }
+ r = stpncpy (s1, buf, len);
+ if (r != s1 + len - 1)
+ {
+ printf ("r = s1 + %d != %zu\n", r - s1, len - 1);
+ return 3;
+ }
+
+ return 0;
+}