1 /* $OpenBSD: exec_self.c,v 1.3 2024/01/23 10:27:12 anton Exp $ */
2 /*
3 * Written by Artur Grabowski <art@openbsd.org> 2002 Public Domain.
4 */
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <err.h>
9 #include <sys/types.h>
10 #include <sys/mman.h>
11
12 struct {
13 const char pad1[256*1024]; /* avoid read-ahead. */
14 const char string[256*1024]; /* at least one page */
15 const char pad2[256*1024]; /* avoid read-behind. */
16 } const blob __attribute__((section(".openbsd.mutable"))) = {
17 "padding1",
18 "the_test",
19 "padding2"
20 };
21
22 int
main(int argc,char ** argv)23 main(int argc, char **argv)
24 {
25 int pgsz = getpagesize();
26 vaddr_t va, off;
27
28 if (argc > 1) {
29 return (0);
30 }
31 va = (vaddr_t)&blob;
32 off = va & (pgsz - 1);
33
34 /* Make sure that nothing in the "blob" is cached. */
35 if (madvise((void *)(va - off), sizeof(blob) + (off > 0 ? pgsz : 0),
36 MADV_FREE))
37 err(1, "madvise");
38
39 if (execl(argv[0], argv[0], &blob.string, (char *)NULL))
40 err(1, "execl");
41
42 /* NOTREACHED */
43 return (1);
44 }
45