|
@@ -4,6 +4,7 @@
|
|
|
#include <setjmp.h>
|
|
#include <setjmp.h>
|
|
|
#include <signal.h>
|
|
#include <signal.h>
|
|
|
#include <string.h>
|
|
#include <string.h>
|
|
|
|
|
+#include <unistd.h>
|
|
|
#include <sys/mman.h>
|
|
#include <sys/mman.h>
|
|
|
#include <ccan/tap/tap.h>
|
|
#include <ccan/tap/tap.h>
|
|
|
#include <ccan/altstack/altstack.h>
|
|
#include <ccan/altstack/altstack.h>
|
|
@@ -20,13 +21,13 @@ enum {
|
|
|
};
|
|
};
|
|
|
int fail, call1, call2;
|
|
int fail, call1, call2;
|
|
|
char *m_;
|
|
char *m_;
|
|
|
-rlim_t max_;
|
|
|
|
|
|
|
+rlim_t msz_;
|
|
|
#define e(x) (900+(x))
|
|
#define e(x) (900+(x))
|
|
|
#define seterr(x) (errno = e(x))
|
|
#define seterr(x) (errno = e(x))
|
|
|
#define setcall(x) ((call1 |= !errno ? (x) : 0), (call2 |= errno || out_ ? (x) : 0))
|
|
#define setcall(x) ((call1 |= !errno ? (x) : 0), (call2 |= errno || out_ ? (x) : 0))
|
|
|
#define getrlimit(...) (fail&getrlimit_ ? (seterr(getrlimit_), -1) : (setcall(getrlimit_), getrlimit(__VA_ARGS__)))
|
|
#define getrlimit(...) (fail&getrlimit_ ? (seterr(getrlimit_), -1) : (setcall(getrlimit_), getrlimit(__VA_ARGS__)))
|
|
|
#define mmap(...) (fail&mmap_ ? (seterr(mmap_), (void *)-1) : (setcall(mmap_), mmap(__VA_ARGS__)))
|
|
#define mmap(...) (fail&mmap_ ? (seterr(mmap_), (void *)-1) : (setcall(mmap_), mmap(__VA_ARGS__)))
|
|
|
-#define munmap(a, b) (fail&munmap_ ? (seterr(munmap_), -1) : (setcall(munmap_), munmap(m_=(a), max_=(b))))
|
|
|
|
|
|
|
+#define munmap(a, b) (fail&munmap_ ? (seterr(munmap_), -1) : (setcall(munmap_), munmap(m_=(a), msz_=(b))))
|
|
|
#define setrlimit(...) (fail&setrlimit_ ? (seterr(setrlimit_), -1) : (setcall(setrlimit_), setrlimit(__VA_ARGS__)))
|
|
#define setrlimit(...) (fail&setrlimit_ ? (seterr(setrlimit_), -1) : (setcall(setrlimit_), setrlimit(__VA_ARGS__)))
|
|
|
#define sigaltstack(...) (fail&sigaltstack_ ? (seterr(sigaltstack_), -1) : (setcall(sigaltstack_), sigaltstack(__VA_ARGS__)))
|
|
#define sigaltstack(...) (fail&sigaltstack_ ? (seterr(sigaltstack_), -1) : (setcall(sigaltstack_), sigaltstack(__VA_ARGS__)))
|
|
|
#define sigaction(...) (fail&sigaction_ ? (seterr(sigaction_), -1) : (setcall(sigaction_), sigaction(__VA_ARGS__)))
|
|
#define sigaction(...) (fail&sigaction_ ? (seterr(sigaction_), -1) : (setcall(sigaction_), sigaction(__VA_ARGS__)))
|
|
@@ -58,7 +59,9 @@ static void *wrap(void *i)
|
|
|
|
|
|
|
|
int main(void)
|
|
int main(void)
|
|
|
{
|
|
{
|
|
|
- plan_tests(16);
|
|
|
|
|
|
|
+ long pgsz = sysconf(_SC_PAGESIZE);
|
|
|
|
|
+
|
|
|
|
|
+ plan_tests(17);
|
|
|
|
|
|
|
|
#define chkfail(x, y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, ok1((fail = x) && (y) && errno == (z) && call1 == (c1) && call2 == (c2)));
|
|
#define chkfail(x, y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, ok1((fail = x) && (y) && errno == (z) && call1 == (c1) && call2 == (c2)));
|
|
|
#define chkok( y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, fail = 0, ok1((y) && errno == (z) && call1 == (c1) && call2 == (c2)));
|
|
#define chkok( y, z, c1, c2) (call1 = 0, call2 = 0, errno = 0, fail = 0, ok1((y) && errno == (z) && call1 == (c1) && call2 == (c2)));
|
|
@@ -86,7 +89,7 @@ int main(void)
|
|
|
chkfail(munmap_, altstack(8*MiB, wrap, 0, 0) == 1, e(munmap_),
|
|
chkfail(munmap_, altstack(8*MiB, wrap, 0, 0) == 1, e(munmap_),
|
|
|
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
|
|
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
|
|
|
setrlimit_|sigaltstack_|sigaction_);
|
|
setrlimit_|sigaltstack_|sigaction_);
|
|
|
- if (fail = 0, munmap(m_, max_) == -1)
|
|
|
|
|
|
|
+ if (fail = 0, munmap(m_, msz_) == -1)
|
|
|
err(1, "munmap");
|
|
err(1, "munmap");
|
|
|
|
|
|
|
|
chkok( altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
|
|
chkok( altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
|
|
@@ -102,10 +105,12 @@ int main(void)
|
|
|
chkfail(munmap_, altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
|
|
chkfail(munmap_, altstack(1*MiB, wrap, (void *) 1000000, 0) == -1, EOVERFLOW,
|
|
|
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
|
|
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
|
|
|
setrlimit_|sigaltstack_|sigaction_);
|
|
setrlimit_|sigaltstack_|sigaction_);
|
|
|
- if (fail = 0, munmap(m_, max_) == -1)
|
|
|
|
|
|
|
+ if (fail = 0, munmap(m_, msz_) == -1)
|
|
|
err(1, "munmap");
|
|
err(1, "munmap");
|
|
|
|
|
|
|
|
- ok1(used > 1*MiB-1*KiB && used < 1*MiB);
|
|
|
|
|
|
|
+ ok1(altstack_max() == 1*MiB);
|
|
|
|
|
+ diag("used: %lu", used);
|
|
|
|
|
+ ok1(used >= 1*MiB - pgsz && used <= 1*MiB + pgsz);
|
|
|
|
|
|
|
|
char *p;
|
|
char *p;
|
|
|
for(p = altstack_geterr(); *p; p++)
|
|
for(p = altstack_geterr(); *p; p++)
|
|
@@ -128,7 +133,8 @@ int main(void)
|
|
|
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
|
|
getrlimit_|setrlimit_|mmap_|sigaltstack_|sigaction_,
|
|
|
setrlimit_|munmap_|sigaltstack_|sigaction_);
|
|
setrlimit_|munmap_|sigaltstack_|sigaction_);
|
|
|
|
|
|
|
|
- ok1(used > 8*MiB-8*KiB && used < 8*MiB);
|
|
|
|
|
|
|
+ diag("used: %lu", used);
|
|
|
|
|
+ ok1(used >= 8*MiB - pgsz && used <= 8*MiB + pgsz);
|
|
|
|
|
|
|
|
used = 0;
|
|
used = 0;
|
|
|
chkok( altstack(8*MiB, wrap, (void *) 100000, 0) == 0, 0,
|
|
chkok( altstack(8*MiB, wrap, (void *) 100000, 0) == 0, 0,
|
|
@@ -138,7 +144,8 @@ int main(void)
|
|
|
used = 1;
|
|
used = 1;
|
|
|
altstack_rsp_save();
|
|
altstack_rsp_save();
|
|
|
dn(0);
|
|
dn(0);
|
|
|
- ok1(used == 32);
|
|
|
|
|
|
|
+ diag("used: %lu", used);
|
|
|
|
|
+ ok1(used == 32 || used == 40);
|
|
|
|
|
|
|
|
return exit_status();
|
|
return exit_status();
|
|
|
}
|
|
}
|