/** * Destroy the eudoxus state when the transaction is complete. * * After the transaction is complete iterate over all of the states create * during the transaction and destroy them. * * @param[in] ib IronBee engine. * @param[in] tx Current transaction. * @param[in] state State (should always be @ref tx_finished_state) * @param[in] cbdata Callback data -- pointer to this module (@ref ib_module_t). * * @returns IB_OK on success. */ static ib_status_t ee_tx_finished_handler(ib_engine_t *ib, ib_tx_t *tx, ib_state_t state, void *cbdata) { ib_status_t rc; ib_hash_t *hash; ib_mpool_lite_t* mpl; ib_mm_t mm; const ib_module_t *m = (const ib_module_t *)cbdata; ee_tx_data_t *data; ib_hash_iterator_t *iterator; rc = ib_tx_get_module_data(tx, m, &hash); if (rc == IB_ENOENT) { /* Nothing to do. */ return IB_OK; } if (rc != IB_OK || hash == NULL) { return rc; } rc = ib_mpool_lite_create(&mpl); if (rc != IB_OK) { return rc; } mm = ib_mm_mpool_lite(mpl); iterator = ib_hash_iterator_create(mm); if (iterator == NULL) { ib_mpool_lite_destroy(mpl); return IB_EALLOC; } for ( ib_hash_iterator_first(iterator, hash); ! ib_hash_iterator_at_end(iterator); ib_hash_iterator_next(iterator) ) { ib_hash_iterator_fetch(NULL, NULL, &data, iterator); if (data->eudoxus_state != NULL) { ia_eudoxus_destroy_state(data->eudoxus_state); data->eudoxus_state = NULL; } } ib_mpool_lite_destroy(mpl); return IB_OK; }
/** * Release resources when the module is unloaded. * * All eudoxus engines created by the LoadEudoxus directive are destroyed. * * @param[in] ib Ironbee engine. * @param[in] m Module instance. * @param[in] cbdata Not used. */ static ib_status_t ee_module_finish(ib_engine_t *ib, ib_module_t *m, void *cbdata) { ib_status_t rc; ia_eudoxus_t *eudoxus; ib_mpool_lite_t *pool; const ee_config_t *config = ee_get_config(ib); ib_hash_t *eudoxus_pattern_hash; ib_hash_iterator_t *iterator; if ( config == NULL || config->eudoxus_pattern_hash == NULL ) { return IB_OK; } eudoxus_pattern_hash = config->eudoxus_pattern_hash; rc = ib_mpool_lite_create(&pool); if (rc != IB_OK) { return rc; } iterator = ib_hash_iterator_create(ib_mm_mpool_lite(pool)); if (iterator == NULL) { ib_mpool_lite_destroy(pool); return IB_EALLOC; } for ( ib_hash_iterator_first(iterator, eudoxus_pattern_hash); ! ib_hash_iterator_at_end(iterator); ib_hash_iterator_next(iterator) ) { ib_hash_iterator_fetch(NULL, NULL, &eudoxus, iterator); if (eudoxus != NULL) { ia_eudoxus_destroy(eudoxus); } } ib_hash_clear(eudoxus_pattern_hash); ib_mpool_lite_destroy(pool); return IB_OK; }
/********************************* * Helper Functions *********************************/ static ib_status_t sqli_create_fingerprint_set_from_file( sqli_fingerprint_set_t **out_ps, const char *path, ib_mm_t mm ) { assert(out_ps != NULL); assert(path != NULL); ib_status_t rc; FILE *fp = NULL; char *buffer = NULL; size_t buffer_size = 0; ib_list_t *items = NULL; ib_list_node_t *n = NULL; ib_mpool_lite_t *tmp = NULL; ib_mm_t tmp_mm; sqli_fingerprint_set_t *ps = NULL; size_t i = 0; /* Temporary memory pool for this function only. */ rc = ib_mpool_lite_create(&tmp); assert(rc == IB_OK); assert(tmp != NULL); tmp_mm = ib_mm_mpool_lite(tmp); fp = fopen(path, "r"); if (fp == NULL) { goto fail; } rc = ib_list_create(&items, tmp_mm); assert(rc == IB_OK); assert(items != NULL); for (;;) { char *buffer_copy; int read = getline(&buffer, &buffer_size, fp); char *space = NULL; ib_num_t confidence = 0; sqli_fingerprint_entry_t *entry = ib_mm_alloc(tmp_mm, sizeof(*entry)); if (read == -1) { if (! feof(fp)) { fclose(fp); goto fail; } else { break; } } while (buffer[read-1] == '\n' || buffer[read-1] == '\r') { buffer[read-1] = '\0'; --read; } space = strstr(buffer, " "); if (space != NULL) { rc = ib_type_atoi(space + 1, 10, &confidence); if (rc != IB_OK || confidence > 100) { return IB_EINVAL; } *space = '\0'; } buffer_copy = ib_mm_strdup(mm, buffer); assert(buffer_copy != NULL); entry->confidence = confidence; entry->fingerprint = buffer_copy; rc = ib_list_push(items, (void *)entry); assert(rc == IB_OK); } fclose(fp); ps = ib_mm_alloc(mm, sizeof(*ps)); assert(ps != NULL); ps->num_fingerprints = ib_list_elements(items); ps->fingerprints = ib_mm_alloc(mm, ps->num_fingerprints * sizeof(*ps->fingerprints)); assert(ps->fingerprints != NULL); i = 0; IB_LIST_LOOP(items, n) { const sqli_fingerprint_entry_t *entry = (const sqli_fingerprint_entry_t *)ib_list_node_data(n); ps->fingerprints[i] = *entry; ++i; } assert(i == ps->num_fingerprints); ib_mpool_lite_destroy(tmp); qsort( ps->fingerprints, ps->num_fingerprints, sizeof(*ps->fingerprints), &sqli_cmp ); *out_ps = ps; return IB_OK; fail: ib_mpool_lite_destroy(tmp); return IB_EINVAL; }