diff options
author | Sverker Eriksson <[email protected]> | 2015-11-10 15:43:15 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2015-11-10 15:43:15 +0100 |
commit | 949de78331b9c4ecb9c628bb651cecb113790e2e (patch) | |
tree | 108bbaeb677a9f0445ca5580e2d6034be8f58161 /erts/emulator/beam/dist.c | |
parent | 1eeb980a3591b51f12363543b2ac9b0260ebd870 (diff) | |
download | otp-949de78331b9c4ecb9c628bb651cecb113790e2e.tar.gz otp-949de78331b9c4ecb9c628bb651cecb113790e2e.tar.bz2 otp-949de78331b9c4ecb9c628bb651cecb113790e2e.zip |
erts: Fix bug in setnode/2
that could lead strange things to happen when renaming a node with
a name that already exist in node and dist tables.
Problem:
erts_set_this_node() is a bit brutal and does not handle the case
when an old remote node name is reused as the new local node name.
Solution:
Treat erts_this_node and erts_this_dist_entry as all the others
with correct reference counting.
Diffstat (limited to 'erts/emulator/beam/dist.c')
-rw-r--r-- | erts/emulator/beam/dist.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c index 5a0f8388f8..56a8633f85 100644 --- a/erts/emulator/beam/dist.c +++ b/erts/emulator/beam/dist.c @@ -2572,7 +2572,9 @@ int distribution_info(int to, void *arg) /* Called by break handler */ } for (dep = erts_not_connected_dist_entries; dep; dep = dep->next) { - info_dist_entry(to, arg, dep, 0, 0); + if (dep != erts_this_dist_entry) { + info_dist_entry(to, arg, dep, 0, 0); + } } return(0); @@ -3012,11 +3014,11 @@ BIF_RETTYPE nodes_1(BIF_ALIST_1) erts_smp_rwmtx_rlock(&erts_dist_table_rwmtx); - ASSERT(erts_no_of_not_connected_dist_entries >= 0); + ASSERT(erts_no_of_not_connected_dist_entries > 0); ASSERT(erts_no_of_hidden_dist_entries >= 0); ASSERT(erts_no_of_visible_dist_entries >= 0); if(not_connected) - length += erts_no_of_not_connected_dist_entries; + length += (erts_no_of_not_connected_dist_entries - 1); if(hidden) length += erts_no_of_hidden_dist_entries; if(visible) @@ -3038,8 +3040,10 @@ BIF_RETTYPE nodes_1(BIF_ALIST_1) #endif if(not_connected) for(dep = erts_not_connected_dist_entries; dep; dep = dep->next) { - result = CONS(hp, dep->sysname, result); - hp += 2; + if (dep != erts_this_dist_entry) { + result = CONS(hp, dep->sysname, result); + hp += 2; + } } if(hidden) for(dep = erts_hidden_dist_entries; dep; dep = dep->next) { |