diff options
author | Sverker Eriksson <[email protected]> | 2018-05-15 20:42:46 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2018-05-16 14:22:35 +0200 |
commit | d7bacbc798d608f259eb2faaaf194cb9df323018 (patch) | |
tree | 3f83cbd4c488c99322189ff8431e9ab60fb39848 /erts/emulator/test/nif_SUITE_data | |
parent | da06fd040775fffee17409ebbd6fa797e34d6f99 (diff) | |
download | otp-d7bacbc798d608f259eb2faaaf194cb9df323018.tar.gz otp-d7bacbc798d608f259eb2faaaf194cb9df323018.tar.bz2 otp-d7bacbc798d608f259eb2faaaf194cb9df323018.zip |
erts: Fix bug in enif_binary_to_term for immediates
Symptom: Heap corruption
Expanded test case to provoke this bug
and test some more term types.
Diffstat (limited to 'erts/emulator/test/nif_SUITE_data')
-rw-r--r-- | erts/emulator/test/nif_SUITE_data/nif_SUITE.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c index f2b1ef9d24..3d262913aa 100644 --- a/erts/emulator/test/nif_SUITE_data/nif_SUITE.c +++ b/erts/emulator/test/nif_SUITE_data/nif_SUITE.c @@ -1958,7 +1958,7 @@ static ERL_NIF_TERM term_to_binary(ErlNifEnv* env, int argc, const ERL_NIF_TERM static ERL_NIF_TERM binary_to_term(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary bin; - ERL_NIF_TERM term, ret_term; + ERL_NIF_TERM term, dummy, ret_term; ErlNifPid pid; ErlNifEnv *msg_env = env; unsigned int opts; @@ -1971,6 +1971,9 @@ static ERL_NIF_TERM binary_to_term(ErlNifEnv* env, int argc, const ERL_NIF_TERM || !enif_get_uint(env, argv[2], &opts)) return enif_make_badarg(env); + /* build dummy heap term first to provoke OTP-15080 */ + dummy = enif_make_list_cell(msg_env, atom_true, atom_false); + ret = enif_binary_to_term(msg_env, bin.data, bin.size, &term, (ErlNifBinaryToTerm)opts); if (!ret) @@ -1978,11 +1981,12 @@ static ERL_NIF_TERM binary_to_term(ErlNifEnv* env, int argc, const ERL_NIF_TERM ret_term = enif_make_uint64(env, ret); if (msg_env != env) { - enif_send(env, &pid, msg_env, term); + enif_send(env, &pid, msg_env, + enif_make_tuple2(msg_env, term, dummy)); enif_free_env(msg_env); return ret_term; } else { - return enif_make_tuple2(env, ret_term, term); + return enif_make_tuple3(env, ret_term, term, dummy); } } |