diff options
author | Lukas Larsson <[email protected]> | 2019-02-12 16:46:33 +0100 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2019-02-22 11:12:54 +0100 |
commit | bf7c722bd3b30e04a56c2d369fd9f5501a8316d0 (patch) | |
tree | 64bc891786d71282e653224153799dc03eff28d8 /erts/emulator/beam/erl_node_tables.c | |
parent | c0c6f6b137e91f626157389733d1510c192002cf (diff) | |
download | otp-bf7c722bd3b30e04a56c2d369fd9f5501a8316d0.tar.gz otp-bf7c722bd3b30e04a56c2d369fd9f5501a8316d0.tar.bz2 otp-bf7c722bd3b30e04a56c2d369fd9f5501a8316d0.zip |
erts: Fix so that externals with creation 0 compare equal to all
The special creation of 0 is used by internally created externals,
such as when list_to_pid is called. This creation should compare
equal to all externals creations of that external. If it does not
we can end up in very strange scenarios. For instance:
> P = spawn(OtherNode, fun() -> die end).
<8303.60.0>
> link(<8303.60.0>).
true
> flush().
ok
OTP-15613
Diffstat (limited to 'erts/emulator/beam/erl_node_tables.c')
-rw-r--r-- | erts/emulator/beam/erl_node_tables.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c index 8fe5c3c690..afafaf48dc 100644 --- a/erts/emulator/beam/erl_node_tables.c +++ b/erts/emulator/beam/erl_node_tables.c @@ -802,8 +802,9 @@ node_table_hash(void *venp) static int node_table_cmp(void *venp1, void *venp2) { - return ((((ErlNode *) venp1)->sysname == ((ErlNode *) venp2)->sysname - && ((ErlNode *) venp1)->creation == ((ErlNode *) venp2)->creation) + return ((((ErlNode *) venp1)->sysname == ((ErlNode *) venp2)->sysname) && + ((((ErlNode *) venp1)->creation == ((ErlNode *) venp2)->creation) || + (((ErlNode *) venp1)->creation == 0 || ((ErlNode *) venp2)->creation == 0)) ? 0 : 1); } |