diff options
author | Erlang/OTP <otp@erlang.org> | 2021-09-02 12:15:50 +0200 |
---|---|---|
committer | Erlang/OTP <otp@erlang.org> | 2021-09-02 12:15:50 +0200 |
commit | 69398da229401f645de1086bf47bfd5430a81e4b (patch) | |
tree | a9b7a8c4a23beefd8f3057313dee258de7a1f9bb | |
parent | 4460930334a89ec2697121b82941b4a55ab843ff (diff) | |
parent | 81805d631b6e196f2a71abc58b0c469186bec58e (diff) | |
download | erlang-69398da229401f645de1086bf47bfd5430a81e4b.tar.gz |
Merge branch 'bjorn/erts/fix-map-decoding/OTP-17594' into maint-22
* bjorn/erts/fix-map-decoding/OTP-17594:
Make binary_to_term/1 more resilent against bad binaries
-rw-r--r-- | erts/emulator/beam/external.c | 5 | ||||
-rw-r--r-- | erts/emulator/test/binary_SUITE.erl | 16 |
2 files changed, 20 insertions, 1 deletions
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 15dcb069d2..b2bb251db3 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -4249,7 +4249,6 @@ dec_term_atom_common: (void) PSTACK_POP(hamt_array); } while (!PSTACK_IS_EMPTY(hamt_array)); - PSTACK_DESTROY(hamt_array); } /* Iterate through all the (flat)maps and check for validity and sort keys @@ -4261,6 +4260,9 @@ dec_term_atom_common: if (!erts_validate_and_sort_flatmap((flatmap_t*)next)) goto error; } + + /* Now that no more errors can occur, the stacks can be destroyed safely. */ + PSTACK_DESTROY(hamt_array); WSTACK_DESTROY(flat_maps); ASSERT((Eterm*)*dbg_resultp != NULL); @@ -4847,6 +4849,7 @@ init_done: if (n <= MAP_SMALL_MAP_LIMIT) { heap_size += 3 + n + 1 + n; } else { + CHKSIZE(2*n); /* Conservative size check */ heap_size += HASHMAP_ESTIMATED_HEAP_SIZE(n); } break; diff --git a/erts/emulator/test/binary_SUITE.erl b/erts/emulator/test/binary_SUITE.erl index 06db9d3ff3..c4ebe2ab3b 100644 --- a/erts/emulator/test/binary_SUITE.erl +++ b/erts/emulator/test/binary_SUITE.erl @@ -1408,6 +1408,22 @@ test_terms(Test_Func) -> Test_Func(FF = fun binary_SUITE:all/0), Test_Func(lists:duplicate(32, FF)), + %% Maps. + SmallMap = #{a => 1, b => 2, c => 3}, + LargeMap1 = maps:from_list([{list_to_atom(integer_to_list(36#cafe+N*N*N, 36)),N} || + N <- lists:seq(1, 33)]), + LargeMap2 = maps:from_list([{list_to_atom(integer_to_list(36#dead+N, 36)),N} || + N <- lists:seq(1, 50)]), + MapWithMap = LargeMap1#{SmallMap => a, LargeMap1 => LargeMap2, LargeMap2 => LargeMap1, + [LargeMap1,LargeMap2] => LargeMap1, + <<"abc">> => SmallMap, <<"qrs">> => LargeMap1, + <<"xyz">> => LargeMap2 }, + Test_Func(#{}), + Test_Func(SmallMap), + Test_Func(LargeMap1), + Test_Func(LargeMap2), + Test_Func(MapWithMap), + ok. test_floats(Test_Func) -> |