diff options
author | Andreas Schneider <asn@samba.org> | 2021-02-02 18:10:38 +0100 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2021-02-05 12:14:09 +0000 |
commit | 40e503732dc0129b8e5f7bc84ca027514d2ef02e (patch) | |
tree | f1410f4a9b206c394ea9918a1cda3a594e67c6da | |
parent | 65b3648c55332d6186c6a03c0ef56e683a7afa46 (diff) | |
download | samba-40e503732dc0129b8e5f7bc84ca027514d2ef02e.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-12-test): Karolin Seeger <kseeger@samba.org>
Autobuild-Date(v4-12-test): Fri Feb 5 12:14:09 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 |