diff options
author | Sverker Eriksson <sverker@erlang.org> | 2020-02-04 19:49:43 +0100 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2020-02-04 22:59:44 +0100 |
commit | bf77ccc9550ff7f43016e55f7ad810b8aa166c2e (patch) | |
tree | e07b58612e36d3b3b56212279546917eaee6c307 /erts/emulator/beam/erl_db_hash.c | |
parent | 7fe7fa3dde556b5b92522f8279d465bb52baf1f6 (diff) | |
download | erlang-bf77ccc9550ff7f43016e55f7ad810b8aa166c2e.tar.gz |
erts: Fix bug in ets:update_counter causing wrong table size
if
* called on 'set' table
* with 4th argument Default
* Key does not exist in table
* operation fails due to invalid UpdateOp.
Table size counter would be falsely decremented
which could make ets:info(T,size) return a negative value or
an absurd large value.
Bug introduced in OTP-19.0.2 by
a6d87854c3ae65dba8dba6571b4d31d901316a39.
Diffstat (limited to 'erts/emulator/beam/erl_db_hash.c')
-rw-r--r-- | erts/emulator/beam/erl_db_hash.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_db_hash.c b/erts/emulator/beam/erl_db_hash.c index 42d7909a08..77ae3f5774 100644 --- a/erts/emulator/beam/erl_db_hash.c +++ b/erts/emulator/beam/erl_db_hash.c @@ -3129,16 +3129,19 @@ db_finalize_dbterm_hash(int cret, DbUpdateHandle* handle) } WUNLOCK_HASH(lck); - erts_atomic_dec_nob(&tb->common.nitems); + if (!(handle->flags & DB_INC_TRY_GROW)) + erts_atomic_dec_nob(&tb->common.nitems); try_shrink(tb); } else { if (handle->flags & DB_MUST_RESIZE) { + ASSERT(cret == DB_ERROR_NONE); db_finalize_resize(handle, offsetof(HashDbTerm,dbterm)); free_me = b; } if (handle->flags & DB_INC_TRY_GROW) { int nactive; int nitems = erts_atomic_inc_read_nob(&tb->common.nitems); + ASSERT(cret == DB_ERROR_NONE); WUNLOCK_HASH(lck); nactive = NACTIVE(tb); |