summaryrefslogtreecommitdiff
path: root/libpthread/tests/test-4.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2010-08-01 01:52:54 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2010-08-01 01:52:54 +0200
commitd3c289d5867fefd5340328b7bd8cec32ca726d92 (patch)
treeabd01dcff720ad69b0d5c105b4ea78b9fb9a9db5 /libpthread/tests/test-4.c
parent5b293b7099ab66c8c60529655df513ce2e640c3c (diff)
parent68567b88ee8f9e395e0c1f0a565affe8a1d4d68b (diff)
Merge tag 'upstream/libpthread/20090404' into upstream-merged
Diffstat (limited to 'libpthread/tests/test-4.c')
-rw-r--r--libpthread/tests/test-4.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/libpthread/tests/test-4.c b/libpthread/tests/test-4.c
new file mode 100644
index 00000000..de9c8fe4
--- /dev/null
+++ b/libpthread/tests/test-4.c
@@ -0,0 +1,86 @@
+/* Test the stack guard. */
+
+#define _GNU_SOURCE
+
+#include <pthread.h>
+#include <assert.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+
+size_t stacksize;
+
+void *
+thr (void *arg)
+{
+ int i;
+ char *foo;
+
+ foo = alloca (3 * stacksize / 4);
+ for (i = 0; i < sizeof foo; i ++)
+ foo[i] = -1;
+
+ return (void *) 1;
+}
+
+int
+main (int argc, char *argv[])
+{
+ error_t err;
+ pid_t child;
+
+ child = fork ();
+ switch (child)
+ {
+ case -1:
+ error (1, errno, "fork");
+ break;
+
+ case 0:
+ {
+ pthread_attr_t attr;
+ pthread_t tid;
+ void *ret;
+
+ err = pthread_attr_init (&attr);
+ assert_perror (err);
+
+ err = pthread_attr_getstacksize (&attr, &stacksize);
+ assert_perror (err);
+
+ err = pthread_attr_setguardsize (&attr, stacksize / 2);
+ if (err == ENOTSUP)
+ {
+ printf ("Stack guard attribute not supported.\n");
+ return 1;
+ }
+ assert_perror (err);
+
+ err = pthread_create (&tid, &attr, thr, 0);
+ assert_perror (err);
+
+ err = pthread_attr_destroy (&attr);
+ assert_perror (err);
+
+ err = pthread_join (tid, &ret);
+ /* Should never be successful. */
+ printf ("Thread did not segfault!?!\n");
+ assert_perror (err);
+ return 0;
+ }
+
+ default:
+ {
+ pid_t pid;
+ int status;
+
+ pid = waitpid (child, &status, 0);
+ printf ("pid = %d; child = %d; status = %d\n", pid, child, status);
+ assert (pid == child);
+ assert (status != 0);
+ }
+ }
+
+ return 0;
+}