From 895ad9975ba24a9301a7e0ba8c5b3e34f1bc26c1 Mon Sep 17 00:00:00 2001 From: Kees Monshouwer Date: Wed, 22 Mar 2023 22:05:03 +0100 Subject: [PATCH] auth, lmdb, backport delete fixes --- modules/lmdbbackend/lmdbbackend.cc | 6 +-- .../lmdb-metadata-leak/command | 41 +++++++++++++++++++ .../lmdb-metadata-leak/description | 2 + .../lmdb-metadata-leak/expected_result | 32 +++++++++++++++ tasks.py | 1 + 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100755 regression-tests.nobackend/lmdb-metadata-leak/command create mode 100644 regression-tests.nobackend/lmdb-metadata-leak/description create mode 100644 regression-tests.nobackend/lmdb-metadata-leak/expected_result diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index 8d3d561fae..a17c729d61 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -696,7 +696,7 @@ bool LMDBBackend::deleteDomain(const DNSName& domain) auto range = txn.equal_range<0>(domain); for (auto& iter = range.first; iter != range.second; ++iter) { - iter.del(); + txn.del(iter.getID()); } txn.commit(); @@ -707,7 +707,7 @@ bool LMDBBackend::deleteDomain(const DNSName& domain) auto range = txn.equal_range<0>(domain); for (auto& iter = range.first; iter != range.second; ++iter) { - iter.del(); + txn.del(iter.getID()); } txn.commit(); @@ -1189,7 +1189,7 @@ bool LMDBBackend::setDomainMetadata(const DNSName& name, const std::string& kind for (auto& iter = range.first; iter != range.second; ++iter) { if (iter->key == kind) - iter.del(); + txn.del(iter.getID()); } for (const auto& m : meta) { diff --git a/regression-tests.nobackend/lmdb-metadata-leak/command b/regression-tests.nobackend/lmdb-metadata-leak/command new file mode 100755 index 0000000000..c4d9d02c0a --- /dev/null +++ b/regression-tests.nobackend/lmdb-metadata-leak/command @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -e +if [ "${PDNS_DEBUG}" = "YES" ]; then + set -x +fi + +rootPath=$(readlink -f $(dirname $0)) + +for random in no yes +do + workdir=$(mktemp -d) + + cat << EOF > "${workdir}/pdns-lmdb.conf" + module-dir=../regression-tests/modules + launch=lmdb + lmdb-filename=${workdir}/pdns.lmdb + lmdb-shards=2 + lmdb-random-ids=$random +EOF + + echo === random=$random + + echo == creating zone + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb create-zone example.com + + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb set-meta example.com FOO BAR + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb show-zone example.com | grep FOO + mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort + + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb set-meta example.com FOO2 BAR2 + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb show-zone example.com | grep FOO + mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort + + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb set-meta example.com FOO2 BAR2 + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb show-zone example.com | grep FOO + mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort + + echo == deleting zone + $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb delete-zone example.com + mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort +done \ No newline at end of file diff --git a/regression-tests.nobackend/lmdb-metadata-leak/description b/regression-tests.nobackend/lmdb-metadata-leak/description new file mode 100644 index 0000000000..99a978307f --- /dev/null +++ b/regression-tests.nobackend/lmdb-metadata-leak/description @@ -0,0 +1,2 @@ +This test verifies that, with the LMDB-backend, pdnsutil set-meta and delete-zone do not leave old unreachable metadata items lying around + diff --git a/regression-tests.nobackend/lmdb-metadata-leak/expected_result b/regression-tests.nobackend/lmdb-metadata-leak/expected_result new file mode 100644 index 0000000000..d1be72c233 --- /dev/null +++ b/regression-tests.nobackend/lmdb-metadata-leak/expected_result @@ -0,0 +1,32 @@ +=== random=no +== creating zone +Set 'example.com' meta FOO = BAR + FOO BAR +FOO +Set 'example.com' meta FOO2 = BAR2 + FOO BAR + FOO2 BAR2 +FOO +FOO2 +Set 'example.com' meta FOO2 = BAR2 + FOO BAR + FOO2 BAR2 +FOO +FOO2 +== deleting zone +=== random=yes +== creating zone +Set 'example.com' meta FOO = BAR + FOO BAR +FOO +Set 'example.com' meta FOO2 = BAR2 + FOO BAR + FOO2 BAR2 +FOO +FOO2 +Set 'example.com' meta FOO2 = BAR2 + FOO BAR + FOO2 BAR2 +FOO +FOO2 +== deleting zone diff --git a/tasks.py b/tasks.py index 1f06930c92..0e14a44132 100644 --- a/tasks.py +++ b/tasks.py @@ -108,6 +108,7 @@ auth_test_deps = [ # FIXME: we should be generating some of these from shlibde 'libsystemd0', 'libyaml-cpp0.6', 'libzmq3-dev', + 'lmdb-utils', 'prometheus', 'ruby-bundler', 'ruby-dev', -- 2.47.2