From c3c42ef56f530aa3b36c5b6f3b955fab08ca1dd7 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 6 Apr 2020 00:11:22 -0500 Subject: [PATCH] Fix case for #336. Also consider ascii 127 (delete) non-printable for string escapes. --- src/core/marsh.c | 20 ++++++++++---------- src/core/pp.c | 2 +- test/suite8.janet | 5 +++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/core/marsh.c b/src/core/marsh.c index bb30eed6..e9fb821b 100644 --- a/src/core/marsh.c +++ b/src/core/marsh.c @@ -931,17 +931,13 @@ static const uint8_t *unmarshal_one_fiber( /* Push fiber to seen stack */ 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 */ 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_stacktop = readnat(st, &data); int32_t fiber_maxstack = readnat(st, &data); + JanetTable *fiber_env = NULL; /* Check for bad flags and ints */ if ((int32_t)(frame + JANET_FRAME_SIZE) > fiber_stackstart || @@ -951,15 +947,18 @@ static const uint8_t *unmarshal_one_fiber( } /* Allocate stack memory */ - fiber->capacity = fiber->stacktop + 10; + fiber->capacity = fiber_stacktop + 10; fiber->data = malloc(sizeof(Janet) * fiber->capacity); if (!fiber->data) { JANET_OUT_OF_MEMORY; } + for (int32_t i = 0; i < fiber->capacity; i++) { + fiber->data[i] = janet_wrap_nil(); + } /* get frames */ - stack = frame; - stacktop = fiber_stackstart - JANET_FRAME_SIZE; + int32_t stack = frame; + int32_t stacktop = fiber_stackstart - JANET_FRAME_SIZE; while (stack > 0) { JanetFunction *func = NULL; JanetFuncDef *def = NULL; @@ -1033,7 +1032,7 @@ static const uint8_t *unmarshal_one_fiber( fiber_flags &= ~JANET_FIBER_FLAG_HASENV; data = unmarshal_one(st, data, &envv, flags + 1); janet_asserttype(envv, JANET_TABLE); - fiber->env = janet_unwrap_table(envv); + fiber_env = janet_unwrap_table(envv); } /* Check for child fiber */ @@ -1051,6 +1050,7 @@ static const uint8_t *unmarshal_one_fiber( fiber->stackstart = fiber_stackstart; fiber->stacktop = fiber_stacktop; fiber->maxstack = fiber_maxstack; + fiber->env = fiber_env; /* Return data */ *out = fiber; diff --git a/src/core/pp.c b/src/core/pp.c index 23e708de..b0c914fb 100644 --- a/src/core/pp.c +++ b/src/core/pp.c @@ -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); break; default: - if (c < 32 || c > 127) { + if (c < 32 || c > 126) { uint8_t buf[4]; buf[0] = '\\'; buf[1] = 'x'; diff --git a/test/suite8.janet b/test/suite8.janet index b2b51740..3855aa47 100644 --- a/test/suite8.janet +++ b/test/suite8.janet @@ -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)) # 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") (unmarshal x load-image-dict) (gccollect) (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)