diff --git a/src/acl.c b/src/acl.c index 155bb145..be004a9d 100644 --- a/src/acl.c +++ b/src/acl.c @@ -130,7 +130,7 @@ init_firewall() if (pclose(fp) == 0) { mode = FIREWALLD_MODE; } else { - /* Check whether we have permission to operate iptables. + /* Check whether we have permission to operate iptables. * Note that checking `iptables --version` is insufficient: * eg, running within a child user namespace. */ @@ -223,6 +223,16 @@ set_firewall_rule(char *addr, int add) return 0; } +static void +free_firewall_rule(void *key, void *element) +{ + if (key == NULL) + return; + char *addr = (char *)key; + set_firewall_rule(addr, 0); + ss_free(element); +} + #endif void @@ -231,8 +241,10 @@ init_block_list() // Initialize cache #ifdef __linux__ init_firewall(); -#endif + cache_create(&block_list, 256, free_firewall_rule); +#else cache_create(&block_list, 256, NULL); +#endif } void @@ -248,12 +260,6 @@ int remove_from_block_list(char *addr) { size_t addr_len = strlen(addr); - -#ifdef __linux__ - if (cache_key_exist(block_list, addr, addr_len)) - set_firewall_rule(addr, 0); -#endif - return cache_remove(block_list, addr, addr_len); } diff --git a/src/cache.c b/src/cache.c index 127792d9..ad921d5b 100644 --- a/src/cache.c +++ b/src/cache.c @@ -47,7 +47,7 @@ */ int cache_create(struct cache **dst, const size_t capacity, - void (*free_cb)(void *element)) + void (*free_cb)(void *key, void *element)) { struct cache *new = NULL; @@ -92,7 +92,7 @@ cache_delete(struct cache *cache, int keep_data) HASH_DEL(cache->entries, entry); if (entry->data != NULL) { if (cache->free_cb) { - cache->free_cb(entry->data); + cache->free_cb(entry->key, entry->data); } else { ss_free(entry->data); } @@ -132,7 +132,7 @@ cache_clear(struct cache *cache, ev_tstamp age) HASH_DEL(cache->entries, entry); if (entry->data != NULL) { if (cache->free_cb) { - cache->free_cb(entry->data); + cache->free_cb(entry->key, entry->data); } else { ss_free(entry->data); } @@ -173,7 +173,7 @@ cache_remove(struct cache *cache, char *key, size_t key_len) HASH_DEL(cache->entries, tmp); if (tmp->data != NULL) { if (cache->free_cb) { - cache->free_cb(tmp->data); + cache->free_cb(tmp->key, tmp->data); } else { ss_free(tmp->data); } @@ -291,7 +291,7 @@ cache_insert(struct cache *cache, char *key, size_t key_len, void *data) HASH_DELETE(hh, cache->entries, entry); if (entry->data != NULL) { if (cache->free_cb) { - cache->free_cb(entry->data); + cache->free_cb(entry->key, entry->data); } else { ss_free(entry->data); } diff --git a/src/cache.h b/src/cache.h index 9e97a4ad..0ec98f55 100644 --- a/src/cache.h +++ b/src/cache.h @@ -47,11 +47,11 @@ struct cache_entry { struct cache { size_t max_entries; /**