summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_db_hash.c
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2020-02-04 19:49:43 +0100
committerSverker Eriksson <sverker@erlang.org>2020-02-04 22:59:44 +0100
commitbf77ccc9550ff7f43016e55f7ad810b8aa166c2e (patch)
treee07b58612e36d3b3b56212279546917eaee6c307 /erts/emulator/beam/erl_db_hash.c
parent7fe7fa3dde556b5b92522f8279d465bb52baf1f6 (diff)
downloaderlang-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.c5
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);