static void test_rend_cache_increment_allocation(void *data) { (void)data; // Test when the cache is not overflowing rend_cache_total_allocation = 5; rend_cache_increment_allocation(3); tt_int_op(rend_cache_total_allocation, OP_EQ, 8); // Test when there are too many allocations rend_cache_total_allocation = SIZE_MAX-1; setup_full_capture_of_logs(LOG_WARN); rend_cache_increment_allocation(2); tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); expect_single_log_msg_containing( "Overflow in rend_cache_increment_allocation"); teardown_capture_of_logs(); // And again rend_cache_increment_allocation(2); tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); done: teardown_capture_of_logs(); }
static void test_rend_cache_increment_allocation(void *data) { (void)data; // Test when the cache is not overflowing rend_cache_total_allocation = 5; rend_cache_increment_allocation(3); tt_int_op(rend_cache_total_allocation, OP_EQ, 8); // Test when there are too many allocations rend_cache_total_allocation = SIZE_MAX-1; rend_cache_increment_allocation(2); tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); // And again rend_cache_increment_allocation(2); tt_u64_op(rend_cache_total_allocation, OP_EQ, SIZE_MAX); done: (void)0; }
/* Try to store a valid version 3 descriptor in the directory cache. Return 0 * on success else a negative value is returned indicating that we have a * newer version in our cache. On error, caller is responsible to free the * given descriptor desc. */ static int cache_store_v3_as_dir(hs_cache_dir_descriptor_t *desc) { hs_cache_dir_descriptor_t *cache_entry; tor_assert(desc); /* Verify if we have an entry in the cache for that key and if yes, check * if we should replace it? */ cache_entry = lookup_v3_desc_as_dir(desc->key); if (cache_entry != NULL) { /* Only replace descriptor if revision-counter is greater than the one * in our cache */ if (cache_entry->plaintext_data->revision_counter >= desc->plaintext_data->revision_counter) { log_info(LD_REND, "Descriptor revision counter in our cache is " "greater or equal than the one we received (%d/%d). " "Rejecting!", (int)cache_entry->plaintext_data->revision_counter, (int)desc->plaintext_data->revision_counter); goto err; } /* We now know that the descriptor we just received is a new one so * remove the entry we currently have from our cache so we can then * store the new one. */ remove_v3_desc_as_dir(cache_entry); rend_cache_decrement_allocation(cache_get_dir_entry_size(cache_entry)); cache_dir_desc_free(cache_entry); } /* Store the descriptor we just got. We are sure here that either we * don't have the entry or we have a newer descriptor and the old one * has been removed from the cache. */ store_v3_desc_as_dir(desc); /* Update our total cache size with this entry for the OOM. This uses the * old HS protocol cache subsystem for which we are tied with. */ rend_cache_increment_allocation(cache_get_dir_entry_size(desc)); /* XXX: Update HS statistics. We should have specific stats for v3. */ return 0; err: return -1; }