From 598677b6ccddfc25735305c6d325996d6ed80f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20H=C3=B6gberg?= Date: Tue, 23 Apr 2019 10:35:53 +0200 Subject: [PATCH] fixup! fixup! Use an array for the position stack rather than an Erlang list --- c_src/termstack.c | 6 +++++- test/jiffy_06_object_tests.erl | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/c_src/termstack.c b/c_src/termstack.c index 7bce38f..95c5b95 100644 --- a/c_src/termstack.c +++ b/c_src/termstack.c @@ -15,7 +15,11 @@ termstack_push(TermStack *stack, ERL_NIF_TERM term) size_t new_size = stack->size * 2; if (stack->elements == &stack->__default_elements[0]) { - stack->elements = enif_alloc(new_size * sizeof(ERL_NIF_TERM)); + ERL_NIF_TERM *new_elements = enif_alloc(new_size * sizeof(ERL_NIF_TERM)); + + memcpy(new_elements, stack->elements, stack->size * sizeof(ERL_NIF_TERM)); + + stack->elements = new_elements; } else { stack->elements = enif_realloc(stack->elements, new_size * sizeof(ERL_NIF_TERM)); diff --git a/test/jiffy_06_object_tests.erl b/test/jiffy_06_object_tests.erl index 9a8f4fb..1baacbf 100644 --- a/test/jiffy_06_object_tests.erl +++ b/test/jiffy_06_object_tests.erl @@ -20,6 +20,14 @@ latin1_atom_test_() -> Expected = <<"{\"", 195, 164, "\":\"bar\"}">>, ?_assertEqual(Expected, enc(#{ Key => <<"bar">> })). +nested_object_segv_test_() -> + Obj = nested(128), + Enc = enc(Obj), + ?_assertEqual(Obj, dec(Enc)). + +nested(0) -> <<"bottom">>; +nested(N) -> {[{integer_to_binary(N), nested(N - 1)}]}. + gen(ok, {J, E}) -> gen(ok, {J, E, J}); gen(ok, {J1, E, J2}) ->