aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/export.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-01-12 13:58:26 +0100
committerSverker Eriksson <[email protected]>2017-01-12 13:58:26 +0100
commitaf5169d85fcd545e3c857a219db081a62f33404d (patch)
treea08ad74d060311ada3b11b76fd419a1d01e32415 /erts/emulator/beam/export.c
parent2b41d8f318b7e5ec139d42fd2f01a132699be839 (diff)
downloadotp-af5169d85fcd545e3c857a219db081a62f33404d.tar.gz
otp-af5169d85fcd545e3c857a219db081a62f33404d.tar.bz2
otp-af5169d85fcd545e3c857a219db081a62f33404d.zip
erts: Fix race bug between export fun creation and code loading
Symptom: SEGV crash on ARM in delete_code() -> export_list(). Could probably happen on other machines as well. Problem: Staging export table was iterated in an unsafe way while an entry was added for a new export fun. Solution: Correct write order and some memory barriers.
Diffstat (limited to 'erts/emulator/beam/export.c')
-rw-r--r--erts/emulator/beam/export.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/erts/emulator/beam/export.c b/erts/emulator/beam/export.c
index 2a19211987..2a007ce860 100644
--- a/erts/emulator/beam/export.c
+++ b/erts/emulator/beam/export.c
@@ -348,7 +348,7 @@ Export *export_list(int i, ErtsCodeIndex code_ix)
int export_list_size(ErtsCodeIndex code_ix)
{
- return export_tables[code_ix].entries;
+ return erts_index_num_entries(&export_tables[code_ix]);
}
int export_table_sz(void)