]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
lock accesses to hash table
authorMark Andrews <marka@isc.org>
Mon, 29 Apr 2019 23:49:42 +0000 (09:49 +1000)
committerMark Andrews <marka@isc.org>
Tue, 7 May 2019 00:37:37 +0000 (10:37 +1000)
bin/plugins/filter-aaaa.c

index e62dff59af3a19064bfd900cd3ae7b3a5cd8cba6..f24e7d45c529e0d05c8cfb5e94f461501d0eed5b 100644 (file)
@@ -89,6 +89,7 @@ typedef struct filter_instance {
         * Hash table associating a client object with its persistent data.
         */
        isc_ht_t *ht;
+       isc_mutex_t hlock;
 
        /*
         * Values configured when the module is loaded.
@@ -376,6 +377,7 @@ plugin_register(const char *parameters,
        CHECK(isc_mempool_create(mctx, sizeof(filter_data_t),
                                 &inst->datapool));
        CHECK(isc_ht_init(&inst->ht, mctx, 16));
+       isc_mutex_init(&inst->hlock);
 
        /*
         * Fill the mempool with 1K filter_aaaa state objects at
@@ -446,6 +448,7 @@ plugin_destroy(void **instp) {
 
        if (inst->ht != NULL) {
                isc_ht_destroy(&inst->ht);
+               isc_mutex_destroy(&inst->hlock);
        }
        if (inst->datapool != NULL) {
                isc_mempool_destroy(&inst->datapool);
@@ -519,8 +522,10 @@ client_state_get(const query_ctx_t *qctx, filter_instance_t *inst) {
        filter_data_t *client_state = NULL;
        isc_result_t result;
 
+       LOCK(&inst->hlock);
        result = isc_ht_find(inst->ht, (const unsigned char *)&qctx->client,
                             sizeof(qctx->client), (void **)&client_state);
+       UNLOCK(&inst->hlock);
 
        return (result == ISC_R_SUCCESS ? client_state : NULL);
 }
@@ -538,8 +543,10 @@ client_state_create(const query_ctx_t *qctx, filter_instance_t *inst) {
        client_state->mode = NONE;
        client_state->flags = 0;
 
+       LOCK(&inst->hlock);
        result = isc_ht_add(inst->ht, (const unsigned char *)&qctx->client,
                            sizeof(qctx->client), client_state);
+       UNLOCK(&inst->hlock);
        RUNTIME_CHECK(result == ISC_R_SUCCESS);
 }
 
@@ -552,8 +559,10 @@ client_state_destroy(const query_ctx_t *qctx, filter_instance_t *inst) {
                return;
        }
 
+       LOCK(&inst->hlock);
        result = isc_ht_delete(inst->ht, (const unsigned char *)&qctx->client,
                               sizeof(qctx->client));
+       UNLOCK(&inst->hlock);
        RUNTIME_CHECK(result == ISC_R_SUCCESS);
 
        isc_mempool_put(inst->datapool, client_state);