diff options
author | Andreas Schneider <asn@samba.org> | 2021-02-02 18:10:38 +0100 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2021-02-08 11:42:58 +0000 |
commit | cf9066b21534de4d0a05a696ba2c28ae2813192d (patch) | |
tree | 056bf26401aa1fdca6e213caf935a3ad35c9a308 | |
parent | a3fa41c742900d7a91adc2e80a388e86e5b05f17 (diff) | |
download | samba-cf9066b21534de4d0a05a696ba2c28ae2813192d.tar.gz |
lib:util: Avoid free'ing our own pointer
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14625
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit 0bdbe50fac680be3fe21043246b8c75005611351)
Autobuild-User(v4-13-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-13-test): Mon Feb 8 11:42:58 UTC 2021 on sn-devel-184
-rw-r--r-- | lib/util/memcache.c | 19 | ||||
-rw-r--r-- | selftest/knownfail.d/memcache | 1 |
2 files changed, 15 insertions, 5 deletions
diff --git a/lib/util/memcache.c b/lib/util/memcache.c index 1e616bd0e9a..7b0b27eaddb 100644 --- a/lib/util/memcache.c +++ b/lib/util/memcache.c @@ -223,14 +223,25 @@ static void memcache_delete_element(struct memcache *cache, TALLOC_FREE(e); } -static void memcache_trim(struct memcache *cache) +static void memcache_trim(struct memcache *cache, struct memcache_element *e) { + struct memcache_element *tail = NULL; + if (cache->max_size == 0) { return; } - while ((cache->size > cache->max_size) && DLIST_TAIL(cache->mru)) { - memcache_delete_element(cache, DLIST_TAIL(cache->mru)); + for (tail = DLIST_TAIL(cache->mru); + (cache->size > cache->max_size) && (tail != NULL); + tail = DLIST_TAIL(cache->mru)) + { + if (tail == e) { + tail = DLIST_PREV(tail); + if (tail == NULL) { + break; + } + } + memcache_delete_element(cache, tail); } } @@ -351,7 +362,7 @@ void memcache_add(struct memcache *cache, enum memcache_number n, memcpy(&mtv, cache_value.data, sizeof(mtv)); cache->size += mtv.len; } - memcache_trim(cache); + memcache_trim(cache, e); } void memcache_add_talloc(struct memcache *cache, enum memcache_number n, diff --git a/selftest/knownfail.d/memcache b/selftest/knownfail.d/memcache deleted file mode 100644 index 0a74ace3003..00000000000 --- a/selftest/knownfail.d/memcache +++ /dev/null @@ -1 +0,0 @@ -^samba.unittests.memcache.torture_memcache_add_oversize |