]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/cache: fixed reinsert of invalidated record
authorMarek Vavrusa <marek@vavrusa.com>
Fri, 27 May 2016 21:06:11 +0000 (14:06 -0700)
committerMarek Vavrusa <marek@vavrusa.com>
Fri, 27 May 2016 21:20:06 +0000 (14:20 -0700)
when opening an empty database, an invalidated key
value was written resulting in possible corruption
of the cache

daemon/main.c
lib/cache.c
tests/test_cache.c

index a9a1429740af2205c99c189b045a5cb2fe5bd511..bdb0a0007eb042f2e6ba7dfa826a6458358a9fd0 100644 (file)
@@ -430,14 +430,14 @@ int main(int argc, char **argv)
                        ret = run_worker(loop, &engine);
                }
        }
+       if (ret != 0) {
+               ret = EXIT_FAILURE;
+       }
        /* Cleanup. */
-       array_clear(addr_set);
        engine_deinit(&engine);
        worker_reclaim(worker);
        mp_delete(pool.ctx);
-       if (ret != 0) {
-               ret = EXIT_FAILURE;
-       }
+       array_clear(addr_set);
        kr_crypto_cleanup();
        return ret;
 }
index 4a1327223f4f4e130da391b6f47e05da3bb3bcf7..8fe7939fde5e5fd4ba59577d0c07b173f4bd86ca 100644 (file)
@@ -53,15 +53,12 @@ static int assert_right_version(struct kr_cache *cache)
 {
        /* Check cache ABI version */
        knot_db_val_t key = { KEY_VERSION, 2 };
-       knot_db_val_t val = { NULL, 0 };
+       knot_db_val_t val = { KEY_VERSION, 2 };
        int ret = cache_op(cache, read, &key, &val, 1);
        if (ret == 0) {
                ret = kr_error(EEXIST);
        } else {
-               /*
-                * Version doesn't match.
-                * Recreate cache and write version key.
-                */
+               /* Version doesn't match. Recreate cache and write version key. */
                ret = cache_op(cache, count);
                if (ret != 0) { /* Non-empty cache, purge it. */
                        kr_log_info("[cache] purging cache\n");
@@ -69,9 +66,14 @@ static int assert_right_version(struct kr_cache *cache)
                }
                /* Either purged or empty. */
                if (ret == 0) {
+                       /* Key/Val is invalidated by cache purge, recreate it */
+                       key.data = KEY_VERSION;
+                       key.len = 2;
+                       val = key;
                        ret = cache_op(cache, write, &key, &val, 1);
                }
        }
+       cache_op(cache, sync);
        return ret;
 }
 
index 97f8fa97feae18798e1cd8782d1a0e16b35a3e93..096fcb4ae808e232771e9ae32bd9bd9744998028 100644 (file)
@@ -63,6 +63,11 @@ static int fake_test_init(knot_db_t **db, struct kr_cdb_opts *opts, knot_mm_t *p
        return mock();
 }
 
+static int fake_test_sync(knot_db_t *db)
+{
+       return 0;
+}
+
 static void fake_test_deinit(knot_db_t *db)
 {
 }
@@ -94,7 +99,7 @@ static const struct kr_cdb_api *fake_knot_db_lmdb_api(void)
 {
        static const struct kr_cdb_api api = {
                "lmdb_fake_api",
-               fake_test_init, fake_test_deinit, NULL, NULL, NULL,
+               fake_test_init, fake_test_deinit, NULL, NULL, fake_test_sync,
                fake_test_find, fake_test_ins, NULL,
                NULL, NULL
        };