10 #include <ccan/tap/tap.h>
11 #include <ccan/ptrint/ptrint.h>
12 #include <ccan/altstack/altstack.h>
26 #define e(x) (900+(x))
27 #define seterr(x) (errno = e(x))
28 #define getrlimit(...) (fail&getrlimit_ ? (seterr(getrlimit_), -1) : getrlimit(__VA_ARGS__))
29 #define mmap(...) (fail&mmap_ ? (seterr(mmap_), (void *)-1) : mmap(__VA_ARGS__))
30 #define munmap(a, b) (fail&munmap_ ? (seterr(munmap_), -1) : munmap(m_=(a), msz_=(b)))
31 #define setrlimit(...) (fail&setrlimit_ ? (seterr(setrlimit_), -1) : setrlimit(__VA_ARGS__))
32 #define sigaltstack(...) (fail&sigaltstack_ ? (seterr(sigaltstack_), -1) : sigaltstack(__VA_ARGS__))
33 #define sigaction(...) (fail&sigaction_ ? (seterr(sigaction_), -1) : sigaction(__VA_ARGS__))
42 #define stderr mystderr
44 #include <ccan/altstack/altstack.c>
49 static void __attribute__((optimize("O0"))) dn(unsigned long i)
51 if (used) used = altstack_used();
54 static void *wrap(void *i)
60 #define chkfail(x, y, z) \
63 ok1((fail = x) && (y)); \
77 long pgsz = sysconf(_SC_PAGESIZE);
81 chkfail(getrlimit_, altstack(8*MiB, wrap, int2ptr(0), NULL) == -1, e(getrlimit_));
83 chkfail(setrlimit_, altstack(8*MiB, wrap, int2ptr(0), NULL) == -1, e(setrlimit_));
85 chkfail(mmap_, altstack(8*MiB, wrap, int2ptr(0), NULL) == -1, e(mmap_));
87 chkfail(sigaltstack_, altstack(8*MiB, wrap, int2ptr(0), NULL) == -1, e(sigaltstack_));
89 chkfail(sigaction_, altstack(8*MiB, wrap, int2ptr(0), NULL) == -1, e(sigaction_));
91 chkfail(munmap_, altstack(8*MiB, wrap, int2ptr(0), NULL) == 1, e(munmap_));
92 if (fail = 0, munmap(m_, msz_) == -1)
95 chkok( altstack(1*MiB, wrap, int2ptr(1000000), NULL) == -1, EOVERFLOW);
97 // be sure segv catch is repeatable (SA_NODEFER)
98 chkok( altstack(1*MiB, wrap, int2ptr(1000000), NULL) == -1, EOVERFLOW);
101 chkfail(munmap_, altstack(1*MiB, wrap, int2ptr(1000000), NULL) == -1, EOVERFLOW);
102 if (fail = 0, munmap(m_, msz_) == -1)
105 ok1(altstack_max() == 1*MiB);
106 diag("used: %lu", used);
107 ok1(used >= 1*MiB - pgsz && used <= 1*MiB + pgsz);
110 for(p = altstack_geterr(); *p; p++)
111 if (*p >= '0' && *p <= '9')
114 #define estr "(altstack@~~~) SIGSEGV caught; (altstack@~~~) munmap(m, max): Unknown error ~~~"
115 ok1(strcmp(altstack_geterr(), estr) == 0);
117 char buf[ALTSTACK_ERR_MAXLEN*2] = {0};
118 if ((mystderr = fmemopen(buf, sizeof(buf), "w")) == NULL)
123 ok1(strcmp(buf, estr "\n") == 0);
126 chkok( altstack(8*MiB, wrap, int2ptr(1000000), NULL) == -1, EOVERFLOW);
128 diag("used: %lu", used);
129 ok1(used >= 8*MiB - pgsz && used <= 8*MiB + pgsz);
132 chkok( altstack(8*MiB, wrap, int2ptr(100000), NULL) == 0, 0);
137 diag("used: %lu", used);
138 ok1(used == 32 || used == 40);
140 return exit_status();