* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: xfrin.c,v 1.129 2001/11/30 01:59:24 gson Exp $ */
+/* $Id: xfrin.c,v 1.130 2002/09/24 01:04:03 marka Exp $ */
#include <config.h>
struct {
isc_uint32_t request_serial;
- isc_uint32_t end_serial;
+ isc_uint32_t current_serial;
dns_journal_t *journal;
} ixfr;
if (rdata->type == dns_rdatatype_soa) {
isc_uint32_t soa_serial = dns_soa_getserial(rdata);
xfr->state = XFRST_IXFR_ADDSOA;
- xfr->ixfr.end_serial = soa_serial;
+ xfr->ixfr.current_serial = soa_serial;
goto redo;
}
CHECK(ixfr_putdata(xfr, DNS_DIFFOP_DEL, name, ttl, rdata));
if (soa_serial == xfr->end_serial) {
xfr->state = XFRST_END;
break;
+ } else if (soa_serial != xfr->ixfr.current_serial) {
+ xfrin_log(xfr, ISC_LOG_ERROR,
+ "IXFR out of sync: "
+ "expected serial %u, got %u",
+ xfr->ixfr.current_serial, soa_serial);
+ FAIL(DNS_R_FORMERR);
} else {
xfr->state = XFRST_IXFR_DELSOA;
goto redo;
xfr->is_ixfr = ISC_FALSE;
/* ixfr.request_serial */
- /* ixfr.end_serial */
+ /* ixfr.current_serial */
xfr->ixfr.journal = NULL;
xfr->axfr.add_func = NULL;
CHECK(dns_db_createsoatuple(xfr->db, ver, xfr->mctx,
DNS_DIFFOP_EXISTS, &soatuple));
xfr->ixfr.request_serial = dns_soa_getserial(&soatuple->rdata);
+ xfr->ixfr.current_serial = xfr->ixfr.request_serial;
xfrin_log(xfr, ISC_LOG_DEBUG(3),
"requesting IXFR for serial %u",
xfr->ixfr.request_serial);