1
0
mirror of https://github.com/janet-lang/janet synced 2025-05-24 10:14:12 +00:00

Fix case for #336.

Also consider ascii 127 (delete) non-printable for string escapes.
This commit is contained in:
Calvin Rose 2020-04-06 00:11:22 -05:00
parent a3c55681b2
commit c3c42ef56f
3 changed files with 16 additions and 11 deletions

View File

@ -931,17 +931,13 @@ static const uint8_t *unmarshal_one_fiber(
/* Push fiber to seen stack */ /* Push fiber to seen stack */
janet_v_push(st->lookup, janet_wrap_fiber(fiber)); janet_v_push(st->lookup, janet_wrap_fiber(fiber));
/* Set frame later so fiber can be GCed at anytime if unmarshalling fails */
int32_t frame = 0;
int32_t stack = 0;
int32_t stacktop = 0;
/* Read ints */ /* Read ints */
int32_t fiber_flags = readint(st, &data); int32_t fiber_flags = readint(st, &data);
frame = readnat(st, &data); int32_t frame = readnat(st, &data);
int32_t fiber_stackstart = readnat(st, &data); int32_t fiber_stackstart = readnat(st, &data);
int32_t fiber_stacktop = readnat(st, &data); int32_t fiber_stacktop = readnat(st, &data);
int32_t fiber_maxstack = readnat(st, &data); int32_t fiber_maxstack = readnat(st, &data);
JanetTable *fiber_env = NULL;
/* Check for bad flags and ints */ /* Check for bad flags and ints */
if ((int32_t)(frame + JANET_FRAME_SIZE) > fiber_stackstart || if ((int32_t)(frame + JANET_FRAME_SIZE) > fiber_stackstart ||
@ -951,15 +947,18 @@ static const uint8_t *unmarshal_one_fiber(
} }
/* Allocate stack memory */ /* Allocate stack memory */
fiber->capacity = fiber->stacktop + 10; fiber->capacity = fiber_stacktop + 10;
fiber->data = malloc(sizeof(Janet) * fiber->capacity); fiber->data = malloc(sizeof(Janet) * fiber->capacity);
if (!fiber->data) { if (!fiber->data) {
JANET_OUT_OF_MEMORY; JANET_OUT_OF_MEMORY;
} }
for (int32_t i = 0; i < fiber->capacity; i++) {
fiber->data[i] = janet_wrap_nil();
}
/* get frames */ /* get frames */
stack = frame; int32_t stack = frame;
stacktop = fiber_stackstart - JANET_FRAME_SIZE; int32_t stacktop = fiber_stackstart - JANET_FRAME_SIZE;
while (stack > 0) { while (stack > 0) {
JanetFunction *func = NULL; JanetFunction *func = NULL;
JanetFuncDef *def = NULL; JanetFuncDef *def = NULL;
@ -1033,7 +1032,7 @@ static const uint8_t *unmarshal_one_fiber(
fiber_flags &= ~JANET_FIBER_FLAG_HASENV; fiber_flags &= ~JANET_FIBER_FLAG_HASENV;
data = unmarshal_one(st, data, &envv, flags + 1); data = unmarshal_one(st, data, &envv, flags + 1);
janet_asserttype(envv, JANET_TABLE); janet_asserttype(envv, JANET_TABLE);
fiber->env = janet_unwrap_table(envv); fiber_env = janet_unwrap_table(envv);
} }
/* Check for child fiber */ /* Check for child fiber */
@ -1051,6 +1050,7 @@ static const uint8_t *unmarshal_one_fiber(
fiber->stackstart = fiber_stackstart; fiber->stackstart = fiber_stackstart;
fiber->stacktop = fiber_stacktop; fiber->stacktop = fiber_stacktop;
fiber->maxstack = fiber_maxstack; fiber->maxstack = fiber_maxstack;
fiber->env = fiber_env;
/* Return data */ /* Return data */
*out = fiber; *out = fiber;

View File

@ -156,7 +156,7 @@ static void janet_escape_string_impl(JanetBuffer *buffer, const uint8_t *str, in
janet_buffer_push_bytes(buffer, (const uint8_t *)"\\\\", 2); janet_buffer_push_bytes(buffer, (const uint8_t *)"\\\\", 2);
break; break;
default: default:
if (c < 32 || c > 127) { if (c < 32 || c > 126) {
uint8_t buf[4]; uint8_t buf[4];
buf[0] = '\\'; buf[0] = '\\';
buf[1] = 'x'; buf[1] = 'x';

View File

@ -222,9 +222,14 @@ neldb\0\0\0\xD8\x05printG\x01\0\xDE\xDE\xDE'\x03\0marshal_tes/\x02
\0\0\0\0\0*\xFE\x01\04\x02\0\0'\x03\0\r\0\r\0\r\0\r" load-image-dict)) \0\0\0\0\0*\xFE\x01\04\x02\0\0'\x03\0\r\0\r\0\r\0\r" load-image-dict))
# No segfault, valgrind clean. # No segfault, valgrind clean.
(def x @"\xCC\xCD.nd\x80\0\r\x1C\xCDg!\0\x07\xCC\xCD\r\x1Ce\x10\0\r;\xCDb\x04\xFF9\xFF\x80\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04uu\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\0\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04}\x04\x04\x04\x04\x04\x04\x04\x04#\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\0\x01\0\0\x03\x04\x04\x04\xE2\x03\x04\x04\x04\x04\x04\x04\x04\x04\x04\x14\x1A\x04\x04\x04\x04\x04\x18\x04\x04!\x04\xE2\x03\x04\x04\x04\x04\x04\x04$\x04\x04\x04\x04\x04\x04\x04\x04\x04\x80\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04A\0\0\0\x03\0\0!\xBF\xFF") (def x @"\xCC\xCD.nd\x80\0\r\x1C\xCDg!\0\x07\xCC\xCD\r\x1Ce\x10\0\r;\xCDb\x04\xFF9\xFF\x80\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04uu\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\0\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04}\x04\x04\x04\x04\x04\x04\x04\x04#\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\0\x01\0\0\x03\x04\x04\x04\xE2\x03\x04\x04\x04\x04\x04\x04\x04\x04\x04\x14\x1A\x04\x04\x04\x04\x04\x18\x04\x04!\x04\xE2\x03\x04\x04\x04\x04\x04\x04$\x04\x04\x04\x04\x04\x04\x04\x04\x04\x80\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04A\0\0\0\x03\0\0!\xBF\xFF")
(unmarshal x load-image-dict) (unmarshal x load-image-dict)
(gccollect) (gccollect)
(marshal x make-image-dict) (marshal x make-image-dict)
(def b @"\xCC\xCD\0\x03\0\x08\x04\rm\xCD\x7F\xFF\xFF\xFF\x02\0\x02\xD7\xCD\0\x98\0\0\x05\x01\x01\x01\x01\x08\xCE\x01f\xCE../tools/afl/generate_unmarshal_testcases.janet\xCE\x012,\x01\0\0&\x03\0\06\x02\x03\x03)\x03\x01\0*\x04\0\00\x03\x04\0>\x03\0\0\x03\x03\0\0*\x05\0\x11\0\x11\0\x05\0\x05\0\x05\0\x05\0\x05\xC9\xDA\x04\xC9\xC9\xC9")
(unmarshal b load-image-dict)
(gccollect)
(end-suite) (end-suite)