mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Introduce #include <cosmo.h>
to toolchain users
This change improves the way internal APIs are being hidden behind the `COSMO` define. The cosmo.h header will take care of defining that, so that a separate define statement isn't needed. This change also does a lot more to define which APIs are standard, and which belong to Cosmo.
This commit is contained in:
parent
9b55dbe417
commit
4a59210008
115 changed files with 699 additions and 422 deletions
|
@ -18,7 +18,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/pledge.internal.h"
|
||||
#include "libc/calls/struct/seccomp.h"
|
||||
#include "libc/calls/struct/seccomp.internal.h"
|
||||
#include "libc/calls/syscall_support-sysv.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/errno.h"
|
||||
|
|
|
@ -20,10 +20,10 @@
|
|||
#include "libc/calls/internal.h"
|
||||
#include "libc/calls/ioctl.h"
|
||||
#include "libc/calls/pledge.internal.h"
|
||||
#include "libc/calls/struct/bpf.h"
|
||||
#include "libc/calls/struct/filter.h"
|
||||
#include "libc/calls/struct/bpf.internal.h"
|
||||
#include "libc/calls/struct/filter.internal.h"
|
||||
#include "libc/calls/struct/flock.h"
|
||||
#include "libc/calls/struct/seccomp.h"
|
||||
#include "libc/calls/struct/seccomp.internal.h"
|
||||
#include "libc/calls/struct/sigaction.h"
|
||||
#include "libc/calls/struct/sigset.h"
|
||||
#include "libc/calls/struct/stat.h"
|
||||
|
|
|
@ -18,10 +18,10 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/calls/struct/bpf.h"
|
||||
#include "libc/calls/struct/filter.h"
|
||||
#include "libc/calls/struct/bpf.internal.h"
|
||||
#include "libc/calls/struct/filter.internal.h"
|
||||
#include "libc/calls/struct/iovec.h"
|
||||
#include "libc/calls/struct/seccomp.h"
|
||||
#include "libc/calls/struct/seccomp.internal.h"
|
||||
#include "libc/calls/syscall_support-sysv.internal.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
|
|
@ -128,8 +128,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) / GUARDSIZE; ++i) {
|
||||
p = mmap(0, GUARDSIZE, PROT_READ | PROT_WRITE,
|
||||
for (gotsome = i = 0; i < (MEM * 2) / APE_GUARDSIZE; ++i) {
|
||||
p = mmap(0, APE_GUARDSIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_POPULATE, -1, 0);
|
||||
if (p != MAP_FAILED) {
|
||||
gotsome = true;
|
||||
|
@ -141,7 +141,7 @@ TEST(setrlimit, testMemoryLimit) {
|
|||
ASSERT_EQ(ENOMEM, errno);
|
||||
_Exit(0);
|
||||
}
|
||||
rngset(p, GUARDSIZE, _rand64, -1);
|
||||
rngset(p, APE_GUARDSIZE, _rand64, -1);
|
||||
}
|
||||
_Exit(1);
|
||||
}
|
||||
|
@ -161,15 +161,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) / GUARDSIZE; ++i) {
|
||||
p = sys_mmap(0, GUARDSIZE, PROT_READ | PROT_WRITE,
|
||||
for (i = 0; i < (MEM * 2) / APE_GUARDSIZE; ++i) {
|
||||
p = sys_mmap(0, APE_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, GUARDSIZE, _rand64, -1);
|
||||
rngset(p, APE_GUARDSIZE, _rand64, -1);
|
||||
}
|
||||
_Exit(1);
|
||||
}
|
||||
|
@ -191,15 +191,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) / GUARDSIZE; ++i) {
|
||||
p = sys_mmap(0, GUARDSIZE, PROT_READ | PROT_WRITE,
|
||||
for (i = 0; i < (MEM * 2) / APE_GUARDSIZE; ++i) {
|
||||
p = sys_mmap(0, APE_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, GUARDSIZE, _rand64, -1);
|
||||
rngset(p, APE_GUARDSIZE, _rand64, -1);
|
||||
}
|
||||
_Exit(1);
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/memtrack.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/runtime/stack.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
|
@ -150,17 +151,18 @@ TEST(mmap, testMapFixed_destroysEverythingInItsPath) {
|
|||
TEST(mmap, customStackMemory_isAuthorized) {
|
||||
char *stack;
|
||||
uintptr_t w, r;
|
||||
ASSERT_NE(MAP_FAILED, (stack = mmap(NULL, STACKSIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_STACK, -1, 0)));
|
||||
ASSERT_NE(MAP_FAILED,
|
||||
(stack = mmap(NULL, GetStackSize(), PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_STACK, -1, 0)));
|
||||
asm("mov\t%%rsp,%0\n\t"
|
||||
"mov\t%2,%%rsp\n\t"
|
||||
"push\t%3\n\t"
|
||||
"pop\t%1\n\t"
|
||||
"mov\t%0,%%rsp"
|
||||
: "=&r"(w), "=&r"(r)
|
||||
: "rm"(stack + STACKSIZE - 8), "i"(123));
|
||||
: "rm"(stack + GetStackSize() - 8), "i"(123));
|
||||
ASSERT_EQ(123, r);
|
||||
EXPECT_SYS(0, 0, munmap(stack, STACKSIZE));
|
||||
EXPECT_SYS(0, 0, munmap(stack, GetStackSize()));
|
||||
}
|
||||
#endif /* __x86_64__ */
|
||||
|
||||
|
|
|
@ -114,9 +114,9 @@ void TearDown(void) {
|
|||
}
|
||||
|
||||
TEST(mprotect, testOkMemory) {
|
||||
char *p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
char *p = gc(memalign(APE_GUARDSIZE, APE_GUARDSIZE));
|
||||
p[0] = 0;
|
||||
ASSERT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
ASSERT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
p[0] = 1;
|
||||
EXPECT_EQ(1, p[0]);
|
||||
EXPECT_FALSE(gotsegv);
|
||||
|
@ -125,19 +125,19 @@ TEST(mprotect, testOkMemory) {
|
|||
|
||||
TEST(mprotect, testSegfault_writeToReadOnlyAnonymous) {
|
||||
volatile char *p;
|
||||
p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
p = gc(memalign(APE_GUARDSIZE, APE_GUARDSIZE));
|
||||
EXPECT_FALSE(gotsegv);
|
||||
p[0] = 1;
|
||||
EXPECT_FALSE(gotsegv);
|
||||
EXPECT_FALSE(gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ));
|
||||
EXPECT_NE(-1, mprotect(p, APE_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, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
TEST(mprotect, testExecOnly_canExecute) {
|
||||
|
@ -157,33 +157,33 @@ TEST(mprotect, testExecOnly_canExecute) {
|
|||
|
||||
TEST(mprotect, testProtNone_cantEvenRead) {
|
||||
volatile char *p;
|
||||
p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_NONE));
|
||||
p = gc(memalign(APE_GUARDSIZE, APE_GUARDSIZE));
|
||||
EXPECT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_NONE));
|
||||
_missingno(p[0]);
|
||||
EXPECT_TRUE(gotsegv | gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
TEST(mprotect, testExecJit_actuallyWorks) {
|
||||
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
int (*p)(void) = gc(memalign(APE_GUARDSIZE, APE_GUARDSIZE));
|
||||
memcpy(p, kRet31337, sizeof(kRet31337));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_EXEC));
|
||||
EXPECT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_EXEC));
|
||||
EXPECT_EQ(31337, p());
|
||||
EXPECT_FALSE(gotsegv);
|
||||
EXPECT_FALSE(gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
TEST(mprotect, testRwxMap_vonNeumannRules) {
|
||||
if (IsOpenbsd()) return; // boo
|
||||
if (IsXnuSilicon()) return; // boo
|
||||
int (*p)(void) = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
int (*p)(void) = gc(memalign(APE_GUARDSIZE, APE_GUARDSIZE));
|
||||
memcpy(p, kRet31337, sizeof(kRet31337));
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE | PROT_EXEC));
|
||||
EXPECT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_READ | PROT_WRITE | PROT_EXEC));
|
||||
EXPECT_EQ(31337, p());
|
||||
EXPECT_FALSE(gotsegv);
|
||||
EXPECT_FALSE(gotbusted);
|
||||
EXPECT_NE(-1, mprotect(p, GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
EXPECT_NE(-1, mprotect(p, APE_GUARDSIZE, PROT_READ | PROT_WRITE));
|
||||
}
|
||||
|
||||
TEST(mprotect, testExecuteFlatFileMapOpenedAsReadonly) {
|
||||
|
@ -218,13 +218,13 @@ TEST(mprotect, testFileMap_canChangeToExecWhileOpenInRdwrMode) {
|
|||
}
|
||||
|
||||
TEST(mprotect, testBadProt_failsEinval) {
|
||||
volatile char *p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
volatile char *p = gc(memalign(APE_GUARDSIZE, APE_GUARDSIZE));
|
||||
EXPECT_EQ(-1, mprotect(p, 9999, -1));
|
||||
EXPECT_EQ(EINVAL, errno);
|
||||
}
|
||||
|
||||
TEST(mprotect, testZeroSize_doesNothing) {
|
||||
volatile char *p = gc(memalign(GUARDSIZE, GUARDSIZE));
|
||||
volatile char *p = gc(memalign(APE_GUARDSIZE, APE_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