Commit Graph

36369 Commits

Author SHA1 Message Date
Michał Kępień
e0be643f50 Make async hooks code use the 'recursions' array
Async hooks are the last feature using the client->fetchhandle and
client->query.fetch pointers.  Update ns_query_hookasync() and
query_hookresume() so that they use a dedicated slot in the 'recursions'
array.  Note that async hooks are still not expected to initiate
recursion if one was already started by a prior ns_query_recurse() call,
so the REQUIRE assertion in ns_query_hookasync() needs to check the
RECTYPE_NORMAL slot rather than the RECTYPE_HOOK one.
2022-06-14 13:13:32 +02:00
Michał Kępień
af6fcf5641 Make resolver glue code use the 'recursions' array
With prefetch and RPZ code updated to use separate slots in the
'recursions' array, the code responsible for starting recursion in
ns_query_recurse() and resuming query handling in fetch_callback()
should follow suit, so that it does not need to explicitly cooperate
with other code paths that may initiate recursion.

Replace:

  - client->fetchhandle with HANDLE_RECTYPE_NORMAL(client)
  - client->query.fetch with FETCH_RECTYPE_NORMAL(client)

Also update other functions using client->fetchhandle and
client->query.fetch (ns_query_cancel(), query_usestale()) so that those
two fields can shortly be dropped altogether.
2022-06-14 13:13:32 +02:00
Michał Kępień
7611b05e4f Merge branch '3168-2-untangle-prefetch-and-rpz' into 'main'
[2/5] Untangle prefetch and RPZ code

See merge request isc-projects/bind9!5883
2022-06-14 11:41:09 +00:00
Michał Kępień
b7285e4fee Merge branch '3168-1-add-recursionquota-helper-functions' into 'main'
[1/5] Add recursionquota_*() helper functions

See merge request isc-projects/bind9!5882
2022-06-14 11:39:15 +00:00
Michał Kępień
9eaddf2e4f Separate prefetch handling from RPZ fetch handling
Both prefetch code and RPZ code ignore recursion results (caching the
response notwithstanding).  RPZ code has been (ab)using that fact since
commit 08e36aa5a5 by employing
prefetch_done() as the fetch completion callback.  This is only
seemingly a simplification as it makes the code harder to follow ("why
is prefetch code used for handling RPZ-triggered recursion?").

Turn prefetch_done() into a new function whose name clearly conveys its
purpose.  Add a parameter to its prototype in order to allow callers to
specify which slot in the 'recursions' array it should use.  Reintroduce
prefetch_done() as a wrapper for that function.  Add rpzfetch_done(), an
RPZ-exclusive wrapper for that function (using a distinct recursion
type).

Since each slot in the 'recursions' array needs to be initialized before
getting cleaned up when recursion completes, rework fetch_and_forget()
so that it takes recursion type rather than extra fetch options as the
last parameter and make it use the requested slot in the 'recursions'
array rather than a fixed slot (RECTYPE_PREFETCH) for all callers.  This
makes fetch_and_forget() a logical complement of cleanup_after_fetch().

Collectively, these changes make prefetch and RPZ code logically
separate (except for reusing client->recursionquota, which will be
refactored later).
2022-06-14 13:13:32 +02:00
Ondřej Surý
4232a281c8 Add recursionquota_attach*()
Add a set of new helper functions for attaching to the recursion quota
in order to reduce code duplication and to ensure that the recursive
clients counter is always adjusted properly.  Since some callers
(query_prefetch(), query_rpzfetch()) treat exceeding the soft quota as
an error while others (check_recursionquota()) do not, also add two
wrapper functions whose names help convey their purpose, in order to
improve code readability.
2022-06-14 13:13:32 +02:00
Michał Kępień
30ace0663d Make prefetch code use the 'recursions' array
Replace:

  - client->prefetchhandle with HANDLE_RECTYPE_PREFETCH(client)
  - client->query.prefetch with FETCH_RECTYPE_PREFETCH(client)

This is preparatory work for separating prefetch code from RPZ code.
2022-06-14 13:13:32 +02:00
Ondřej Surý
70254724e7 Add recursionquota_detach()
Add a new helper function for detaching from the recursion quota in
order to reduce code duplication and to ensure that detaching from that
quota is always accompanied by decreasing the recursive clients counter.
2022-06-14 13:13:32 +02:00
Michał Kępień
0fd787c8b8 Enable ns_query_t to track multiple recursions
When a client waits for a prefetch- or RPZ-triggered recursion to
complete, its netmgr handle is attached to client->prefetchhandle and a
reference to the resolver fetch is stored in client->query.prefetch.
Both of these features use the same fields mentioned above.  This makes
the code fragile and hard to follow as its logically distinct parts
become intertwined for no obvious reason.

Furthermore, storing pointers related to a specific recursion process in
two different structures makes their purpose harder to grasp than it has
to be.

To alleviate the problem, extend ns_query_t with an array of structures
containing recursion-related pointers.  Each feature able to initiate
recursion is supposed to use its own slot in that array, allowing
logically unrelated code paths to be untangled.  Prefetch and RPZ will
be the first users of that array.

Define helper macros for accessing specific recursion-related pointers
in order to improve code readability.
2022-06-14 13:13:32 +02:00
Michał Kępień
76070fbf33 Simplify client->query initialization
Initialize client->query using a compound literal in order to make the
ns_query_init() function shorter and more readable.  This also prevents
the need to explicitly initialize any newly added fields in the future.
2022-06-14 13:13:32 +02:00
Michał Kępień
525d2875ec Use common code to start prefetches & RPZ fetches
query_prefetch() and query_rpzfetch() contain a lot of duplicated code.
Extract the common bits into a separate function whose name clearly
suggests its purpose.
2022-06-14 13:13:32 +02:00
Petr Špaček
fe1ac19194 Merge branch 'pspacek/dnssec-guide-keymgr-removal' into 'main'
Remove description of dnssec-keymgr from DNSSEC Guide

See merge request isc-projects/bind9!6410
2022-06-14 11:12:33 +00:00
Petr Špaček
0e1306374e Remove description of dnssec-keygmr from DNSSEC Guide
dnssec-keymgr is not included in the distribution since BIND 9.17 so
there is no point in keeping usage instructions around.
2022-06-14 13:08:53 +02:00
Ondřej Surý
e8cc03f1df Merge branch '3400-gracefully-handle-the-errors-from-uv_start_read' into 'main'
Gracefully handle uv_read_start() failures

Closes #3400

See merge request isc-projects/bind9!6424
2022-06-14 09:46:54 +00:00
Ondřej Surý
646df5cbbc Add CHANGES and release note for [GL #3400] 2022-06-14 11:33:02 +02:00
Ondřej Surý
b432d5d3bc Gracefully handle uv_read_start() failures
Under specific rare timing circumstances the uv_read_start() could
fail with UV_EINVAL when the connection is reset between the connect (or
accept) and the uv_read_start() call on the nmworker loop.  Handle such
situation gracefully by propagating the errors from uv_read_start() into
upper layers, so the socket can be internally closed().
2022-06-14 11:33:02 +02:00
Michal Nowak
520cf01d56 Merge branch 'mnowak/fix-statistics-system-test-on-ol7' into 'main'
Fix statistics system test on Oracle Linux 7

See merge request isc-projects/bind9!6394
2022-06-14 07:40:39 +00:00
Michal Nowak
49cb896929 Fix statistics system test on Oracle Linux 7
The statistics system test fails on Oracle Linux 7 when libxml2, Curl,
and xsltproc are present:

    I:statistics:checking bind9.xsl vs xml (17)
    diff: curl.out.17.xsl: No such file or directory
    tests.sh: line 183: curl.out.17.xml: No such file or directory
    cp: cannot stat 'curl.out.17.xml': No such file or directory
    grep: xsltproc.out.17: No such file or directory

This is because the Oracle Linux 7 Curl does not know about the
--http1.1 option and silently fails with:

    + /usr/bin/curl --http1.1 http://10.53.0.3:7252
    curl: option --http1.1: is unknown
    curl: try 'curl --help' or 'curl --manual' for more information

The following test "checking bind9.xml socket statistics" then needs to
check for existence of stats.xml.out file which is artifact of the
previous test.
2022-06-14 09:38:07 +02:00
Petr Špaček
a3731e9d06 Merge branch '3395-dnssec-signzone-default-0-iterations' into 'main'
Set default number of additional NSEC3 iterations to 0 in dnssec-signzone

Closes #3395

See merge request isc-projects/bind9!6416
2022-06-14 07:05:47 +00:00
Petr Špaček
d029d6374d Set default number of additional NSEC3 iterations to 0 in dnssec-signzone
We forgot to update dnssec-signzone while updating KASP defaults.

Closes: #3395
Related: #2956
2022-06-14 08:30:32 +02:00
Mark Andrews
a8e7db0fd4 Merge branch 'typo-in-log-on-update-forward-opcode-mismatch' into 'main'
Typo in log on update forward opcode mismatch

See merge request isc-projects/bind9!6420
2022-06-14 02:04:33 +00:00
Mark Andrews
bd508194be Add CHANGES note for [GL !6420] 2022-06-14 11:41:07 +10:00
JINMEI Tatuya
a58647df6a make the fix more complete 2022-06-13 16:30:00 -07:00
JINMEI Tatuya
2b81a69659 corrected the opcode param to opcode_totext 2022-06-13 16:25:40 -07:00
Evan Hunt
765af0910f Merge branch '3386-nxdomain-serve-stale' into 'main'
don't keep stale NXDOMAIN cache entries

Closes #3386

See merge request isc-projects/bind9!6396
2022-06-13 20:31:26 +00:00
Evan Hunt
15f08ca961 CHANGES and release note for [GL #3386] 2022-06-13 12:53:51 -07:00
Evan Hunt
f1485ca145 don't keep stale NXDOMAIN cache entries
when serve-stale is enabled, NXDOMAIN cache entries are no longer
preserved after the normal negative cache TTL, in order to reduce
unnecessary cache memory consumption.
2022-06-13 12:53:37 -07:00
Michał Kępień
ae09f1d89f Merge branch 'michal/remove-redundant-checks-for-ns-client-functions' into 'main'
Remove NULL checks for ns_client_newrdataset()

See merge request isc-projects/bind9!6417
2022-06-13 12:23:52 +00:00
Michał Kępień
07592d1315 Check for NULL before dereferencing qctx->rpz_st
Commit 9ffb4a7ba1 causes Clang Static
Analyzer to flag a potential NULL dereference in query_nxdomain():

    query.c:9394:26: warning: Dereference of null pointer [core.NullDereference]
            if (!qctx->nxrewrite || qctx->rpz_st->m.rpz->addsoa) {
                                    ^~~~~~~~~~~~~~~~~~~
    1 warning generated.

The warning above is for qctx->rpz_st potentially being a NULL pointer
when query_nxdomain() is called from query_resume().  This is a false
positive because none of the database lookup result codes currently
causing query_nxdomain() to be called (DNS_R_EMPTYWILD, DNS_R_NXDOMAIN)
can be returned by a database lookup following a recursive resolution
attempt.  Add a NULL check nevertheless in order to future-proof the
code and silence Clang Static Analyzer.
2022-06-13 14:03:16 +02:00
Michał Kępień
39fd8efbb7 Remove NULL checks for ns_client_getnamebuf()
ns_client_getnamebuf() cannot fail (i.e. return NULL) since commit
e31cc1eeb4.  Remove redundant NULL checks
performed on the pointer returned by ns_client_getnamebuf().
2022-06-10 14:30:23 +02:00
Michał Kępień
a229236019 Remove NULL checks for ns_client_newname()
ns_client_newname() cannot fail (i.e. return NULL) since commit
2ce0de6995 (though it was only made more
apparent by commit 33ba0057a7).  Remove
redundant NULL checks performed on the pointer returned by
ns_client_newname().
2022-06-10 14:30:23 +02:00
Michał Kępień
9ffb4a7ba1 Remove NULL checks for ns_client_newrdataset()
ns_client_newrdataset() cannot fail (i.e. return NULL) since commit
efb385ecdc (though it was only made more
apparent by commit 33ba0057a7).  Remove
redundant NULL checks performed on the pointer returned by
ns_client_newrdataset().
2022-06-10 14:30:23 +02:00
Petr Špaček
189417c76b Merge branch 'pspacek/keyfromlabel-doc-alg-clarif' into 'main'
Clarify dnssec-keyfromlabel -a in man page

See merge request isc-projects/bind9!6412
2022-06-10 05:54:30 +00:00
Petr Špaček
5f53003dae Clarify dnssec-keyfromlabel -a in man page 2022-06-09 15:00:08 +02:00
Petr Špaček
e93c2e9a0f Merge branch 'pspacek/arm-statement-syntax' into 'main'
Add Sphinx extension to help with ARM maintenance and cross-linking

See merge request isc-projects/bind9!6395
2022-06-09 12:55:50 +00:00
Petr Špaček
33931c97fa Add tag filter to .. statementlist:: RST directive
Introduce a new syntax:
.. namedconf:statementlist::
   :filter_tags: acl, resolver

The resulting table contains only items tagged as acl OR resolver.
2022-06-09 14:44:33 +02:00
Petr Špaček
ff577462f9 Warn about duplicate .. statement:: definitions 2022-06-09 14:44:33 +02:00
Petr Špaček
2f2aa1d21c Refactor and unite internal data structures for iscconf Sphinx extension
It turns out it is easier to regenerate Sphinx-mandated structure in
get_objects than to maintain two separate data structures. I should have
realized that before.
2022-06-09 14:44:33 +02:00
Petr Špaček
475f7a9603 Render optional statement metadata in the ARM
Optional values :short: and :tags: are now rendered right after the
statement heading.
2022-06-09 14:44:33 +02:00
Petr Špaček
976aef030a Add table generator into Sphinx config extension
New directive .. statementlist:: generates table of statements in a
the given domain (named.conf or rndc.conf). The table contains link to
definition, short description, and also list of tags.
Short description and tags have to be provided by user using optional
parameters. E.g.:

.. statement:: max-cache-size
   :tags: resolver, cache
   :short: Short description

.. statementlist:: is currently not parametrized.

This modification is based on Sphinx "tutorial" extension "TODO".
The main trick is to use placeholder node for .. statementlist:: and
replace it with table at later stage, when all source files were
processed and all cross-references can be resolved.

Beware, some details in Sphinx docs are not up-to-date, it's better
to read Sphinx and docutil sources.
2022-06-09 14:44:33 +02:00
Petr Špaček
b12606cebe Extend .. statement:: directive with optional values
New and currently unused values can be provided using this syntax:

.. statement:: max-cache-size
   :tags: resolver, cache
   :short: Short description

The domain stores them in its internal structures for further use.
2022-06-09 14:44:33 +02:00
Petr Špaček
a23fa7edc9 Add Sphinx extension to help with ARM maintenance and cross-linking
The extension provides a "Sphinx domain factory". Each new Sphinx domain
defines a namespace for configuration statements so named.conf and
rndc.conf do not clash. Currently the Sphinx domains are instantiated
twice and resuling domains are named "namedconf" and "rndcconf".

This commit adds a single new directive:

.. statement:: max-cache-size

It is namespaced like this:

.. namedconf:statement:: max-cache-size

This directive generates a new anchor for configuration statement and it
can be referenced like :any:`max-cache-size` (if the identifier is
unique), or more specific :namedconf:ref:`max-cache-size`.

It is based on Sphinx "tutorial" extension "recipe".
Beware, some details in Sphinx docs are not up-to-date, it's better
to read Sphinx and docutil sources.
2022-06-09 14:44:29 +02:00
Arаm Sаrgsyаn
57b72ba1cd Merge branch '2506-catz-member-zone-vs-configured-forward-zone' into 'main'
Check that catz member zone is not a configured forward zone

Closes #2506

See merge request isc-projects/bind9!6256
2022-06-09 11:10:26 +00:00
Aram Sargsyan
887aa7a290 Cleanup dns_fwdtable_delete()
The conversion of `DNS_R_PARTIALMATCH` into `DNS_R_NOTFOUND` is done
in the `dns_rbt_deletename()` function so there is no need to do that
in `dns_fwdtable_delete()`.

Add a possible return value of `ISC_R_NOSPACE` into the header file's
function description comment.
2022-06-09 10:47:04 +00:00
Aram Sargsyan
3191eabbc7 Add CHANGES and release note for [GL #2506] 2022-06-09 10:46:35 +00:00
Aram Sargsyan
b27969ee0b Add forward zone checks in the catz system test
Add a new test to check that a catalog zone member zone does not
get processed when there is a pre-existing forward zone with that
same name.
2022-06-09 10:45:10 +00:00
Aram Sargsyan
8156c46bd2 Convert some catz error messages from ISC_LOG_INFO to ISC_LOG_WARNING
There is no reason for these two messages to be `ISC_LOG_INFO` while all
the other similar messages in `catz_addmodzone_taskaction()` and
`catz_delzone_taskaction()` functions are logged as `ISC_LOG_WARNING`.
2022-06-09 10:45:10 +00:00
Aram Sargsyan
2aff264fb1 Check that catz member zone is not a configured forward zone
When processing a catalog zone member zone make sure that there is no
configured pre-existing forward zone with that name.

Refactor the `dns_fwdtable_find()` function to not alter the
`DNS_R_PARTIALMATCH` result (coming from `dns_rbt_findname()`) into
`DNS_R_SUCCESS`, so that now the caller can differentiate partial
and exact matches. Patch the calling sites to expect and process
the new return value.
2022-06-09 10:45:10 +00:00
Tom Krizek
5712f97c24 Merge branch 'tkrizek/python-codestyle' into 'main'
Enforce Python codestyle with black

See merge request isc-projects/bind9!6404
2022-06-08 10:48:09 +00:00
Tom Krizek
c2275d9f6e Move pylint CI job to precheck stage
Historically, some *.py files were generated, so Python checks required
running ./configure beforehand. This is no longer the case since v9_18,
so let's run the job ASAP without the unnecessary extra dependency on
autoconf job.
2022-06-08 10:46:42 +02:00