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}) ->