summaryrefslogtreecommitdiff
path: root/src/regress/lib
diff options
context:
space:
mode:
authordhartmei <>2002-09-14 22:03:14 +0000
committerdhartmei <>2002-09-14 22:03:14 +0000
commit99933708b28d8f1a889e6109eb237499bf59eba2 (patch)
tree95adbcf0e9cc0d976e8e7b18bd1836b0faa0ecbf /src/regress/lib
parent3a3a489a756f2852d798376f20cc0d4ab609c866 (diff)
downloadopenbsd-99933708b28d8f1a889e6109eb237499bf59eba2.tar.gz
openbsd-99933708b28d8f1a889e6109eb237499bf59eba2.tar.bz2
openbsd-99933708b28d8f1a889e6109eb237499bf59eba2.zip
Move __cleanup into mprotect'ed page to prevent unintentional modifications
similar to the atexit handlers. Idea and help deraadt@, ok deraadt@
Diffstat (limited to 'src/regress/lib')
-rw-r--r--src/regress/lib/libc/atexit/Makefile6
-rw-r--r--src/regress/lib/libc/atexit/atexit_test.c24
2 files changed, 20 insertions, 10 deletions
diff --git a/src/regress/lib/libc/atexit/Makefile b/src/regress/lib/libc/atexit/Makefile
index 89625e2a7b..55c3f3981e 100644
--- a/src/regress/lib/libc/atexit/Makefile
+++ b/src/regress/lib/libc/atexit/Makefile
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile,v 1.2 2002/09/02 19:59:51 avsm Exp $ 1# $OpenBSD: Makefile,v 1.3 2002/09/14 22:03:14 dhartmei Exp $
2 2
3NOMAN= 3NOMAN=
4PROG=atexit_test 4PROG=atexit_test
@@ -6,7 +6,9 @@ PROG=atexit_test
6run-regress-atexit_test: ${PROG} 6run-regress-atexit_test: ${PROG}
7 ./${PROG} -valid 2>${.OBJDIR}/valid.out 7 ./${PROG} -valid 2>${.OBJDIR}/valid.out
8 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok 8 cmp -s ${.OBJDIR}/valid.out ${.CURDIR}/valid.ok
9 ./${PROG} -invalid 2>${.OBJDIR}/invalid.out 9 ./${PROG} -invalid-atexit 2>${.OBJDIR}/invalid.out
10 cmp -s ${.OBJDIR}/invalid.out ${.CURDIR}/invalid.ok
11 ./${PROG} -invalid-cleanup 2>${.OBJDIR}/invalid.out
10 cmp -s ${.OBJDIR}/invalid.out ${.CURDIR}/invalid.ok 12 cmp -s ${.OBJDIR}/invalid.out ${.CURDIR}/invalid.ok
11 13
12.include <bsd.regress.mk> 14.include <bsd.regress.mk>
diff --git a/src/regress/lib/libc/atexit/atexit_test.c b/src/regress/lib/libc/atexit/atexit_test.c
index fcfe95cb02..fea95832ab 100644
--- a/src/regress/lib/libc/atexit/atexit_test.c
+++ b/src/regress/lib/libc/atexit/atexit_test.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: atexit_test.c,v 1.1 2002/07/29 19:51:41 dhartmei Exp $ */ 1/* $OpenBSD: atexit_test.c,v 1.2 2002/09/14 22:03:14 dhartmei Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2002 Daniel Hartmeier 4 * Copyright (c) 2002 Daniel Hartmeier
@@ -39,9 +39,6 @@
39#include <signal.h> 39#include <signal.h>
40#include "/usr/src/lib/libc/stdlib/atexit.h" 40#include "/usr/src/lib/libc/stdlib/atexit.h"
41 41
42extern struct atexit *__atexit;
43extern void (*__cleanup)();
44
45void handle_first(); 42void handle_first();
46void handle_middle(); 43void handle_middle();
47void handle_last(); 44void handle_last();
@@ -57,8 +54,10 @@ main(int argc, char *argv[])
57 int i; 54 int i;
58 55
59 if (argc != 2 || (strcmp(argv[1], "-valid") && 56 if (argc != 2 || (strcmp(argv[1], "-valid") &&
60 strcmp(argv[1], "-invalid"))) { 57 strcmp(argv[1], "-invalid-atexit") &&
61 fprintf(stderr, "%s -valid/-invalid\n", argv[0]); 58 strcmp(argv[1], "-invalid-cleanup"))) {
59 fprintf(stderr, "%s -valid/-invalid-atexit/-invalid-cleanup\n",
60 argv[0]);
62 return (1); 61 return (1);
63 } 62 }
64 fprintf(stderr, "main()\n"); 63 fprintf(stderr, "main()\n");
@@ -77,11 +76,20 @@ main(int argc, char *argv[])
77 return (1); 76 return (1);
78 } 77 }
79 /* this is supposed to segfault */ 78 /* this is supposed to segfault */
80 if (strcmp(argv[1], "-valid")) { 79 if (!strcmp(argv[1], "-invalid-atexit")) {
81 signal(SIGSEGV, handle_signal); 80 signal(SIGSEGV, handle_signal);
82 __atexit->fns[0] = handle_invalid; 81 __atexit->fns[0] = handle_invalid;
82 } else if (!strcmp(argv[1], "-invalid-cleanup")) {
83 struct atexit *p = __atexit;
84
85 signal(SIGSEGV, handle_signal);
86 while (p != NULL && p->next != NULL)
87 p = p->next;
88 if (p == NULL)
89 fprintf(stderr, "p == NULL, no page found\n");
90 p->fns[0] = handle_invalid;
83 } 91 }
84 __cleanup = handle_cleanup; 92 __atexit_register_cleanup(handle_cleanup);
85 counter = 0; 93 counter = 0;
86 fprintf(stderr, "main() returns\n"); 94 fprintf(stderr, "main() returns\n");
87 return (0); 95 return (0);