mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Increase stack size to 128k and guard size to 16k
This improves our compatibility with Apple M1.
This commit is contained in:
parent
57c0dcdc29
commit
dd04aeba1c
36 changed files with 109 additions and 125 deletions
|
@ -125,8 +125,8 @@ TEST(setrlimit, testMemoryLimit) {
|
|||
ASSERT_NE(-1, (wstatus = xspawn(0)));
|
||||
if (wstatus == -2) {
|
||||
ASSERT_EQ(0, SetKernelEnforcedMemoryLimit(MEM));
|
||||
for (gotsome = i = 0; i < (MEM * 2) / PAGESIZE; ++i) {
|
||||
p = mmap(0, PAGESIZE, PROT_READ | PROT_WRITE,
|
||||
for (gotsome = i = 0; i < (MEM * 2) / GUARDSIZE; ++i) {
|
||||
p = mmap(0, GUARDSIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_POPULATE, -1, 0);
|
||||
if (p != MAP_FAILED) {
|
||||
gotsome = true;
|
||||
|
@ -138,7 +138,7 @@ TEST(setrlimit, testMemoryLimit) {
|
|||
ASSERT_EQ(ENOMEM, errno);
|
||||
_Exit(0);
|
||||
}
|
||||
rngset(p, PAGESIZE, _rand64, -1);
|
||||
rngset(p, GUARDSIZE, _rand64, -1);
|
||||
}
|
||||
_Exit(1);
|
||||
}
|
||||
|
@ -158,15 +158,15 @@ TEST(setrlimit, testVirtualMemoryLimit) {
|
|||
ASSERT_NE(-1, (wstatus = xspawn(0)));
|
||||
if (wstatus == -2) {
|
||||
ASSERT_EQ(0, setrlimit(RLIMIT_AS, &(struct rlimit){MEM, MEM}));
|
||||
for (i = 0; i < (MEM * 2) / PAGESIZE; ++i) {
|
||||
p = sys_mmap(0, PAGESIZE, PROT_READ | PROT_WRITE,
|
||||
for (i = 0; i < (MEM * 2) / GUARDSIZE; ++i) {
|
||||
p = sys_mmap(0, GUARDSIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_POPULATE, -1, 0)
|
||||
.addr;
|
||||
if (p == MAP_FAILED) {
|
||||
ASSERT_EQ(ENOMEM, errno);
|
||||
_Exit(0);
|
||||
}
|
||||
rngset(p, PAGESIZE, _rand64, -1);
|
||||
rngset(p, GUARDSIZE, _rand64, -1);
|
||||
}
|
||||
_Exit(1);
|
||||
}
|
||||
|
@ -188,15 +188,15 @@ TEST(setrlimit, testDataMemoryLimit) {
|
|||
ASSERT_NE(-1, (wstatus = xspawn(0)));
|
||||
if (wstatus == -2) {
|
||||
ASSERT_EQ(0, setrlimit(RLIMIT_DATA, &(struct rlimit){MEM, MEM}));
|
||||
for (i = 0; i < (MEM * 2) / PAGESIZE; ++i) {
|
||||
p = sys_mmap(0, PAGESIZE, PROT_READ | PROT_WRITE,
|
||||
for (i = 0; i < (MEM * 2) / GUARDSIZE; ++i) {
|
||||
p = sys_mmap(0, GUARDSIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_POPULATE, -1, 0)
|
||||
.addr;
|
||||
if (p == MAP_FAILED) {
|
||||
ASSERT_EQ(ENOMEM, errno);
|
||||
_Exit(0);
|
||||
}
|
||||
rngset(p, PAGESIZE, _rand64, -1);
|
||||
rngset(p, GUARDSIZE, _rand64, -1);
|
||||
}
|
||||
_Exit(1);
|
||||
}
|
||||
|
|
|
@ -226,9 +226,9 @@ TEST(ksnprintf, fuzzTheUnbreakable) {
|
|||
size_t i;
|
||||
uint64_t x;
|
||||
char *f, b[32];
|
||||
_Alignas(PAGESIZE) static const char weasel[PAGESIZE];
|
||||
_Alignas(FRAMESIZE) static const char weasel[FRAMESIZE];
|
||||
asm("mov\t%1,%0" : "=r"(f) : "g"(weasel));
|
||||
EXPECT_SYS(0, 0, mprotect(f, PAGESIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_SYS(0, 0, mprotect(f, FRAMESIZE, PROT_READ | PROT_WRITE));
|
||||
strcpy(f, "hello %s\n");
|
||||
EXPECT_EQ(12, ksnprintf(b, sizeof(b), f, "world"));
|
||||
EXPECT_STREQ("hello world\n", b);
|
||||
|
@ -240,7 +240,7 @@ TEST(ksnprintf, fuzzTheUnbreakable) {
|
|||
f[Rando() & 15] = '%';
|
||||
ksnprintf(b, sizeof(b), f, lemur64(), lemur64(), lemur64());
|
||||
}
|
||||
EXPECT_SYS(0, 0, mprotect(f, PAGESIZE, PROT_READ));
|
||||
EXPECT_SYS(0, 0, mprotect(f, FRAMESIZE, PROT_READ));
|
||||
}
|
||||
|
||||
TEST(kprintf, testFailure_wontClobberErrnoAndBypassesSystemCallSupport) {
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/intrin/popcnt.h"
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/intrin/popcnt.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/hyperion.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
|
||||
void SetUpOnce(void) {
|
||||
ASSERT_SYS(0, 0, pledge("stdio", 0));
|
||||
ASSERT_SYS(0, 0, pledge("stdio rpath", 0));
|
||||
}
|
||||
|
||||
TEST(popcnt, test) {
|
||||
|
|
|
@ -49,7 +49,7 @@ TEST(brk, underflowsEnd_returnsEinval) {
|
|||
}
|
||||
|
||||
TEST(sbrk, underflowsEnd_returnsEinval) {
|
||||
ASSERT_SYS(EINVAL, MAP_FAILED, sbrk(-PAGESIZE));
|
||||
ASSERT_SYS(EINVAL, MAP_FAILED, sbrk(-GUARDSIZE));
|
||||
}
|
||||
|
||||
TEST(sbrk, giantDelta_returnsEnomem) {
|
||||
|
@ -73,11 +73,11 @@ TEST(sbrk, overlapsExistingMapping_failsWithEexist) {
|
|||
TEST(sbrk, testGrowAndShrink) {
|
||||
SPAWN(fork);
|
||||
ASSERT_FALSE(testlib_memoryexists(_end));
|
||||
ASSERT_SYS(0, _end, sbrk(PAGESIZE));
|
||||
ASSERT_SYS(0, _end + PAGESIZE, sbrk(0));
|
||||
ASSERT_SYS(0, _end, sbrk(GUARDSIZE));
|
||||
ASSERT_SYS(0, _end + GUARDSIZE, sbrk(0));
|
||||
ASSERT_TRUE(testlib_memoryexists(_end));
|
||||
ASSERT_FALSE(testlib_memoryexists(_end + PAGESIZE));
|
||||
ASSERT_SYS(0, _end + PAGESIZE, sbrk(-PAGESIZE));
|
||||
ASSERT_FALSE(testlib_memoryexists(_end + GUARDSIZE));
|
||||
ASSERT_SYS(0, _end + GUARDSIZE, sbrk(-GUARDSIZE));
|
||||
ASSERT_FALSE(testlib_memoryexists(_end));
|
||||
EXITS(0);
|
||||
}
|
||||
|
@ -85,9 +85,9 @@ TEST(sbrk, testGrowAndShrink) {
|
|||
TEST(brk, testGrowAndShrink) {
|
||||
SPAWN(fork);
|
||||
ASSERT_FALSE(testlib_memoryexists(_end));
|
||||
ASSERT_EQ(0, brk(_end + PAGESIZE));
|
||||
ASSERT_EQ(0, brk(_end + GUARDSIZE));
|
||||
ASSERT_TRUE(testlib_memoryexists(_end));
|
||||
ASSERT_FALSE(testlib_memoryexists(_end + PAGESIZE));
|
||||
ASSERT_FALSE(testlib_memoryexists(_end + GUARDSIZE));
|
||||
ASSERT_EQ(0, brk(_end));
|
||||
EXITS(0);
|
||||
}
|
||||
|
|
|
@ -94,9 +94,9 @@ void TearDown(void) {
|
|||
}
|
||||
|
||||
TEST(mprotect, testOkMemory) {
|
||||
char *p = gc(memalign(PAGESIZE, PAGESIZE));
|
||||
char *p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
p[0] = 0;
|
||||
ASSERT_NE(-1, mprotect(p, PAGESIZE, PROT_READ | PROT_WRITE));
|
||||
ASSERT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
p[0] = 1;
|
||||
EXPECT_EQ(1, p[0]);
|
||||
EXPECT_FALSE(gotsegv);
|
||||
|
@ -105,19 +105,19 @@ TEST(mprotect, testOkMemory) {
|
|||
|
||||
TEST(mprotect, testSegfault_writeToReadOnlyAnonymous) {
|
||||
volatile char *p;
|
||||
p = gc(memalign(PAGESIZE, PAGESIZE));
|
||||
p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
EXPECT_FALSE(gotsegv);
|
||||
p[0] = 1;
|
||||
EXPECT_FALSE(gotsegv);
|
||||
EXPECT_FALSE(gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_READ));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ));
|
||||
_missingno(p[0]);
|
||||
EXPECT_FALSE(gotsegv);
|
||||
EXPECT_FALSE(gotbusted);
|
||||
p[0] = 2;
|
||||
EXPECT_TRUE(gotsegv | gotbusted);
|
||||
EXPECT_EQ(1, p[0]);
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
TEST(mprotect, testExecOnly_canExecute) {
|
||||
|
@ -137,11 +137,11 @@ TEST(mprotect, testExecOnly_canExecute) {
|
|||
|
||||
TEST(mprotect, testProtNone_cantEvenRead) {
|
||||
volatile char *p;
|
||||
p = gc(memalign(PAGESIZE, PAGESIZE));
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_NONE));
|
||||
p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_NONE));
|
||||
_missingno(p[0]);
|
||||
EXPECT_TRUE(gotsegv | gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
static const char kRet31337[] = {
|
||||
|
@ -150,24 +150,24 @@ static const char kRet31337[] = {
|
|||
};
|
||||
|
||||
TEST(mprotect, testExecJit_actuallyWorks) {
|
||||
int (*p)(void) = gc(memalign(PAGESIZE, PAGESIZE));
|
||||
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
memcpy(p, kRet31337, sizeof(kRet31337));
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_EXEC));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_EXEC));
|
||||
EXPECT_EQ(31337, p());
|
||||
EXPECT_FALSE(gotsegv);
|
||||
EXPECT_FALSE(gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
TEST(mprotect, testRwxMap_vonNeumannRules) {
|
||||
if (IsOpenbsd()) return; // boo
|
||||
int (*p)(void) = gc(memalign(PAGESIZE, PAGESIZE));
|
||||
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
memcpy(p, kRet31337, sizeof(kRet31337));
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_READ | PROT_WRITE | PROT_EXEC));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE | PROT_EXEC));
|
||||
EXPECT_EQ(31337, p());
|
||||
EXPECT_FALSE(gotsegv);
|
||||
EXPECT_FALSE(gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, PAGESIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
TEST(mprotect, testExecuteFlatFileMapOpenedAsReadonly) {
|
||||
|
@ -202,13 +202,13 @@ TEST(mprotect, testFileMap_canChangeToExecWhileOpenInRdwrMode) {
|
|||
}
|
||||
|
||||
TEST(mprotect, testBadProt_failsEinval) {
|
||||
volatile char *p = gc(memalign(PAGESIZE, PAGESIZE));
|
||||
volatile char *p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
EXPECT_EQ(-1, mprotect(p, 9999, -1));
|
||||
EXPECT_EQ(EINVAL, errno);
|
||||
}
|
||||
|
||||
TEST(mprotect, testZeroSize_doesNothing) {
|
||||
volatile char *p = gc(memalign(PAGESIZE, PAGESIZE));
|
||||
volatile char *p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
EXPECT_NE(-1, mprotect(p, 0, PROT_READ));
|
||||
p[0] = 1;
|
||||
EXPECT_FALSE(gotsegv);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue