The ERP cache has now been isolated and no longer needs to maintain external reference counts. This removes the need for erp_cache_remove (done internally now), erp_cache_put, and erp_cache_entry_get_identity, as well as the cache ref count. --- src/erp.c | 71 ++++++++----------------------------------------------- src/erp.h | 5 ---- 2 files changed, 10 insertions(+), 66 deletions(-) diff --git a/src/erp.c b/src/erp.c index 3ff277ea..50c9f02a 100644 --- a/src/erp.c +++ b/src/erp.c @@ -49,7 +49,6 @@ struct erp_cache_entry { size_t session_len; char *ssid; uint64_t expire_time; - uint32_t ref; bool invalid : 1; }; @@ -147,9 +146,6 @@ static void erp_cache_entry_destroy(void *data) { struct erp_cache_entry *entry = data; - if (entry->ref) - l_error("ERP entry still has a reference on cleanup!"); - l_free(entry->id); l_free(entry->emsk); l_free(entry->session_id); @@ -181,11 +177,11 @@ void erp_cache_add(const char *id, const void *session_id, l_queue_push_head(key_cache, entry); } -static struct erp_cache_entry *find_keycache(const char *id, const char *ssid) +static struct erp_cache_entry *find_keycache(const char *ssid) { const struct l_queue_entry *entry; - if (!id && !ssid) + if (!ssid) return NULL; for (entry = l_queue_get_entries(key_cache); entry; @@ -196,80 +192,30 @@ static struct erp_cache_entry *find_keycache(const char *id, const char *ssid) continue; if (l_time_after(l_time_now(), cache->expire_time)) { - if (!cache->ref) { - l_queue_remove(key_cache, cache); - erp_cache_entry_destroy(cache); - } else - cache->invalid = true; - + cache->invalid = true; continue; } - if (id && !strcmp(cache->id, id)) - return cache; - - if (ssid && !strcmp(cache->ssid, ssid)) + if (!strcmp(cache->ssid, ssid)) return cache; } return NULL; } -void erp_cache_remove(const char *id) -{ - struct erp_cache_entry *entry = find_keycache(id, NULL); - - if (!entry) - return; - - if (entry->ref) { - entry->invalid = true; - return; - } - - l_queue_remove(key_cache, entry); - - erp_cache_entry_destroy(entry); -} - struct erp_cache_entry *erp_cache_get(const char *ssid) { - struct erp_cache_entry *cache = find_keycache(NULL, ssid); + struct erp_cache_entry *cache = find_keycache(ssid); if (!cache) return NULL; - cache->ref++; - return cache; } -void erp_cache_put(struct erp_cache_entry *cache) -{ - cache->ref--; - - if (cache->ref) - return; - - if (!cache->invalid) - return; - - /* - * Cache entry marked as invalid, either it expired or something - * attempted to remove it. Either way, it can now be removed. - */ - l_queue_remove(key_cache, cache); - erp_cache_entry_destroy(cache); -} - -const char *erp_cache_entry_get_identity(struct erp_cache_entry *cache) -{ - return cache->id; -} - bool erp_cache_check_identity(const char *ssid, const char *identity) { - struct erp_cache_entry *cache = find_keycache(NULL, ssid); + struct erp_cache_entry *cache = find_keycache(ssid); if (!cache) return false; @@ -365,7 +311,10 @@ struct erp_state *erp_new(struct erp_cache_entry *cache, void erp_free(struct erp_state *erp) { - erp_cache_put(erp->cache); + if (erp->cache->invalid) { + l_queue_remove(key_cache, erp->cache); + erp_cache_entry_destroy(erp->cache); + } explicit_bzero(erp->rmsk, sizeof(erp->rmsk)); explicit_bzero(erp->r_ik, sizeof(erp->r_ik)); diff --git a/src/erp.h b/src/erp.h index 433b11c9..a6310cb9 100644 --- a/src/erp.h +++ b/src/erp.h @@ -45,11 +45,6 @@ void erp_cache_add(const char *id, const void *session_id, size_t session_len, const void *emsk, size_t emsk_len, const char *ssid); -void erp_cache_remove(const char *id); - struct erp_cache_entry *erp_cache_get(const char *ssid); -void erp_cache_put(struct erp_cache_entry *cache); - -const char *erp_cache_entry_get_identity(struct erp_cache_entry *cache); bool erp_cache_check_identity(const char *ssid, const char *identity); -- 2.31.1