Skip to content
This repository was archived by the owner on Jul 30, 2018. It is now read-only.

Commit 502079b

Browse files
author
wouter
committed
- Fix bug in nodatabase mode with ixfrs that change nsec3param.
git-svn-id: svn+ssh://open.nlnetlabs.nl/svn/nsd/trunk@4249 a26ef69c-88ff-0310-839f-98b793d9c207
1 parent 45de2ee commit 502079b

File tree

5 files changed

+17
-10
lines changed

5 files changed

+17
-10
lines changed

difffile.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -447,8 +447,8 @@ nsec3_delete_rr_trigger(namedb_type* db, rr_type* rr, zone_type* zone,
447447
else if(rr->type == TYPE_NSEC3PARAM && rr == zone->nsec3_param) {
448448
/* clear trees, wipe hashes, wipe precompile */
449449
nsec3_clear_precompile(db, zone);
450-
/* pick up new nsec3param from udb */
451-
nsec3_find_zone_param(db, zone, udbz);
450+
/* pick up new nsec3param (from udb, or avoid deleted rr) */
451+
nsec3_find_zone_param(db, zone, udbz, rr);
452452
/* if no more NSEC3, done */
453453
if(!zone->nsec3_param)
454454
return;
@@ -550,7 +550,7 @@ nsec3_add_rr_trigger(namedb_type* db, rr_type* rr, zone_type* zone,
550550
prehash_add(db->domains, rr->owner);
551551
} else if(!zone->nsec3_param && rr->type == TYPE_NSEC3PARAM) {
552552
/* see if this means NSEC3 chain can be used */
553-
nsec3_find_zone_param(db, zone, udbz);
553+
nsec3_find_zone_param(db, zone, udbz, NULL);
554554
if(!zone->nsec3_param)
555555
return;
556556
nsec3_zone_trees_create(db->region, zone);
@@ -1310,8 +1310,7 @@ apply_ixfr_for_zone(nsd_type* nsd, zone_type* zonedb, FILE* in,
13101310
ret = apply_ixfr(nsd->db, in, zone_buf, new_serial, opt,
13111311
i, num_parts, &is_axfr, &delete_mode,
13121312
&rr_count, (nsd->db->udb?&z:NULL), &zonedb,
1313-
patname_buf, &num_bytes,
1314-
&softfail);
1313+
patname_buf, &num_bytes, &softfail);
13151314
if(ret == 0) {
13161315
log_msg(LOG_ERR, "bad ixfr packet part %d in diff file for %s", (int)i, zone_buf);
13171316
xfrd_unlink_xfrfile(nsd, xfrfilenr);

doc/ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
21 March 2014: Wouter
2+
- Fix bug in nodatabase mode with ixfrs that change nsec3param.
3+
14
19 March 2014: Wouter
25
- made database: "" set the 3600 default for zonefileswrite only
36
if it is also at its default, so that user settings override.

nsec3.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ udb_zone_find_nsec3param(udb_base* udb, udb_ptr* uz, struct zone* z)
245245
}
246246

247247
static struct rr*
248-
db_find_nsec3param(struct zone* z)
248+
db_find_nsec3param(struct zone* z, struct rr* avoid_rr)
249249
{
250250
unsigned i;
251251
rrset_type* rrset = domain_find_rrset(z->apex, z, TYPE_NSEC3PARAM);
@@ -254,6 +254,8 @@ db_find_nsec3param(struct zone* z)
254254
/* find first nsec3param we can support (SHA1, no flags) */
255255
for(i=0; i<rrset->rr_count; i++) {
256256
rdata_atom_type* rd = rrset->rrs[i].rdatas;
257+
/* do not use the RR that is going to be deleted (in IXFR) */
258+
if(&rrset->rrs[i] == avoid_rr) continue;
257259
if(rrset->rrs[i].rdata_count < 4) continue;
258260
if(rdata_atom_data(rd[0])[0] == NSEC3_SHA1_HASH &&
259261
rdata_atom_data(rd[1])[0] == 0) {
@@ -282,12 +284,15 @@ db_find_nsec3param(struct zone* z)
282284
}
283285

284286
void
285-
nsec3_find_zone_param(struct namedb* db, struct zone* zone, udb_ptr* z)
287+
nsec3_find_zone_param(struct namedb* db, struct zone* zone, udb_ptr* z,
288+
struct rr* avoid_rr)
286289
{
287290
/* get nsec3param RR from udb */
288291
if(db->udb)
289292
zone->nsec3_param = udb_zone_find_nsec3param(db->udb, z, zone);
290-
else zone->nsec3_param = db_find_nsec3param(zone);
293+
/* no db, get from memory, avoid using the rr that is going to be
294+
* deleted, avoid_rr */
295+
else zone->nsec3_param = db_find_nsec3param(zone, avoid_rr);
291296
}
292297

293298
/* check params ok for one RR */
@@ -613,7 +618,7 @@ prehash_zone_complete(struct namedb* db, struct zone* zone)
613618
udb_ptr_init(&udbz, db->udb); /* zero the ptr */
614619
}
615620
}
616-
nsec3_find_zone_param(db, zone, &udbz);
621+
nsec3_find_zone_param(db, zone, &udbz, NULL);
617622
if(!zone->nsec3_param || !check_apex_soa(db, zone)) {
618623
zone->nsec3_param = NULL;
619624
zone->nsec3_last = NULL;

nsec3.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ int nsec3_condition_hash(struct domain* d, struct zone* z);
9292
int nsec3_condition_dshash(struct domain* d, struct zone* z);
9393
/* set nsec3param for this zone or NULL if no NSEC3 available */
9494
void nsec3_find_zone_param(struct namedb* db, struct zone* zone,
95-
struct udb_ptr* z);
95+
struct udb_ptr* z, struct rr* avoid_rr);
9696
/* hash domain and wcchild, and lookup nsec3 in tree, and precompile */
9797
void nsec3_precompile_domain(struct namedb* db, struct domain* domain,
9898
struct zone* zone, struct region* tmpregion);

tpkg/nodb_nsec3_ixfr.tpkg

6.23 KB
Binary file not shown.

0 commit comments

Comments
 (0)