Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
BIND
Commits
b52a5b06
Commit
b52a5b06
authored
Mar 27, 2001
by
Andreas Gustafsson
Browse files
790. [bug] Wildcards created using dynamic update or IXFR
could fail to match. [RT #1111]
parent
34613b2e
Changes
2
Hide whitespace changes
Inline
Side-by-side
CHANGES
View file @
b52a5b06
790. [bug] Wildcards created using dynamic update or IXFR
could fail to match. [RT #1111]
789. [bug] The "localhost" and "localnets" ACLs did not match
when used as the second element of a two-element
sortlist item.
...
...
lib/dns/rbtdb.c
View file @
b52a5b06
...
...
@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: rbtdb.c,v 1.15
1
2001/03/
08 03:31:29 tale
Exp $ */
/* $Id: rbtdb.c,v 1.15
2
2001/03/
27 00:06:34 gson
Exp $ */
/*
* Principal Author: Bob Halley
...
...
@@ -1019,6 +1019,40 @@ closeversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {
*
versionp
=
NULL
;
}
/*
* Add the necessary magic for the wildcard name 'name'
* to be found in 'rbtdb'.
*
* In order for wildcard matching to work correctly in
* zone_find(), we must ensure that a node for the wildcarding
* level exists in the database, and has its 'find_callback'
* and 'wild' bits set.
*
* E.g. if the wildcard name is "*.sub.example." then we
* must ensure that "sub.example." exists and is marked as
* a wildcard level.
*/
static
isc_result_t
add_wildcard_magic
(
dns_rbtdb_t
*
rbtdb
,
dns_name_t
*
name
)
{
isc_result_t
result
;
dns_name_t
foundname
;
dns_offsets_t
offsets
;
unsigned
int
n
;
dns_rbtnode_t
*
node
=
NULL
;
dns_name_init
(
&
foundname
,
offsets
);
n
=
dns_name_countlabels
(
name
);
INSIST
(
n
>=
2
);
n
--
;
dns_name_getlabelsequence
(
name
,
1
,
n
,
&
foundname
);
result
=
dns_rbt_addnode
(
rbtdb
->
tree
,
&
foundname
,
&
node
);
if
(
result
!=
ISC_R_SUCCESS
&&
result
!=
ISC_R_EXISTS
)
return
(
result
);
node
->
find_callback
=
1
;
node
->
wild
=
1
;
return
(
ISC_R_SUCCESS
);
}
static
isc_result_t
findnode
(
dns_db_t
*
db
,
dns_name_t
*
name
,
isc_boolean_t
create
,
dns_dbnode_t
**
nodep
)
...
...
@@ -1059,6 +1093,13 @@ findnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,
node
->
locknum
=
dns_name_hash
(
&
nodename
,
ISC_TRUE
)
%
rbtdb
->
node_lock_count
;
#endif
if
(
dns_name_iswildcard
(
name
))
{
result
=
add_wildcard_magic
(
rbtdb
,
name
);
if
(
result
!=
ISC_R_SUCCESS
)
{
RWUNLOCK
(
&
rbtdb
->
tree_lock
,
locktype
);
return
(
result
);
}
}
}
else
if
(
result
!=
ISC_R_EXISTS
)
{
RWUNLOCK
(
&
rbtdb
->
tree_lock
,
locktype
);
return
(
result
);
...
...
@@ -3806,9 +3847,6 @@ loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
isc_result_t
result
;
isc_region_t
region
;
rdatasetheader_t
*
newheader
;
dns_name_t
foundname
;
dns_offsets_t
offsets
;
unsigned
int
n
;
/*
* This routine does no node locking. See comments in
...
...
@@ -3830,28 +3868,9 @@ loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
*/
if
(
rdataset
->
type
==
dns_rdatatype_ns
)
return
(
DNS_R_INVALIDNS
);
/*
* In order for wildcard matching to work correctly in
* zone_find(), we must ensure that a node for the wildcarding
* level exists in the database, and has its 'find_callback'
* and 'wild' bits set.
*
* E.g. if the wildcard name is "*.sub.example." then we
* must ensure that "sub.example." exists and is marked as
* a wildcard level.
*/
dns_name_init
(
&
foundname
,
offsets
);
n
=
dns_name_countlabels
(
name
);
INSIST
(
n
>=
2
);
n
--
;
dns_name_getlabelsequence
(
name
,
1
,
n
,
&
foundname
);
node
=
NULL
;
result
=
dns_rbt_addnode
(
rbtdb
->
tree
,
&
foundname
,
&
node
);
if
(
result
!=
ISC_R_SUCCESS
&&
result
!=
ISC_R_EXISTS
)
result
=
add_wildcard_magic
(
rbtdb
,
name
);
if
(
result
!=
ISC_R_SUCCESS
)
return
(
result
);
node
->
find_callback
=
1
;
node
->
wild
=
1
;
}
node
=
NULL
;
...
...
@@ -3859,6 +3878,7 @@ loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
if
(
result
!=
ISC_R_SUCCESS
&&
result
!=
ISC_R_EXISTS
)
return
(
result
);
if
(
result
!=
ISC_R_EXISTS
)
{
dns_name_t
foundname
;
dns_name_init
(
&
foundname
,
NULL
);
dns_rbt_namefromnode
(
node
,
&
foundname
);
#ifdef DNS_RBT_USEHASH
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment