Fix C stack remaining check in MODE=tiny

This commit is contained in:
Justine Tunney 2022-07-14 07:23:15 -07:00
parent bcdd5c5f74
commit 28b9d9f781
5 changed files with 11 additions and 7 deletions

View file

@ -121,6 +121,13 @@ extern char ape_stack_align[] __attribute__((__weak__));
vAddr; \ vAddr; \
}) })
/**
* Returns true if at least `n` bytes of stack are available.
*/
#define HaveStackMemory(n) \
(IsTiny() || \
(intptr_t)__builtin_frame_address(0) >= GetStackAddr() + PAGESIZE * (n))
COSMOPOLITAN_C_END_ COSMOPOLITAN_C_END_
#endif /* GNU ELF */ #endif /* GNU ELF */
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */

View file

@ -124,9 +124,6 @@ res, err = DecodeJson([[
{"k":{"k":{"k":{"k":0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {"k":{"k":{"k":{"k":0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
}}}}}}}}} }}}}}}}}}
]]) ]])
if not res then
print('wut', err)
end
assert(res) assert(res)
-- 64 objects -- 64 objects

View file

@ -18,6 +18,7 @@
*/ */
#include "libc/assert.h" #include "libc/assert.h"
#include "libc/bits/bits.h" #include "libc/bits/bits.h"
#include "libc/bits/likely.h"
#include "libc/fmt/itoa.h" #include "libc/fmt/itoa.h"
#include "libc/intrin/kprintf.h" #include "libc/intrin/kprintf.h"
#include "libc/log/log.h" #include "libc/log/log.h"
@ -165,7 +166,7 @@ static int SerializeTable(lua_State *L, char **buf, int idx,
int rc; int rc;
bool isarray; bool isarray;
lua_Unsigned n; lua_Unsigned n;
if ((intptr_t)__builtin_frame_address(0) < GetStackAddr() + PAGESIZE * 2) { if (UNLIKELY(!HaveStackMemory(PAGESIZE))) {
z->reason = "out of stack"; z->reason = "out of stack";
return -1; return -1;
} }

View file

@ -336,7 +336,7 @@ static int SerializeTable(lua_State *L, char **buf, int idx,
struct Serializer *z, int depth) { struct Serializer *z, int depth) {
int rc; int rc;
intptr_t rsp, bot; intptr_t rsp, bot;
if ((intptr_t)__builtin_frame_address(0) < GetStackAddr() + PAGESIZE * 2) { if (UNLIKELY(!HaveStackMemory(PAGESIZE))) {
z->reason = "out of stack"; z->reason = "out of stack";
return -1; return -1;
} }

View file

@ -50,8 +50,7 @@ static struct DecodeJson Parse(struct lua_State *L, const char *p,
if (UNLIKELY(!depth)) { if (UNLIKELY(!depth)) {
return (struct DecodeJson){-1, "maximum depth exceeded"}; return (struct DecodeJson){-1, "maximum depth exceeded"};
} }
if (UNLIKELY((intptr_t)__builtin_frame_address(0) < if (UNLIKELY(!HaveStackMemory(PAGESIZE))) {
GetStackAddr() + PAGESIZE * 2)) {
return (struct DecodeJson){-1, "out of stack"}; return (struct DecodeJson){-1, "out of stack"};
} }
for (a = p, d = +1; p < e;) { for (a = p, d = +1; p < e;) {