From 5a6112ec8f8b04a7510967cee96ad68f90f1723d Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 31 Mar 2021 13:29:13 +1100 Subject: [PATCH 1/6] Use journal_write_xhdr() to write the dummy transaction header Instead of journal_write(), use correct format call journal_write_xhdr() to write the dummy transaction header which looks at j->header_ver1 to determine which transaction header to write instead of always writing a zero filled journal_rawxhdr_t header. --- lib/dns/journal.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/dns/journal.c b/lib/dns/journal.c index b15e77e0fb..cbc5a1c7f2 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -1101,7 +1101,6 @@ isc_result_t dns_journal_begin_transaction(dns_journal_t *j) { uint32_t offset; isc_result_t result; - journal_rawxhdr_t hdr; REQUIRE(DNS_JOURNAL_VALID(j)); REQUIRE(j->state == JOURNAL_STATE_WRITE || @@ -1128,8 +1127,7 @@ dns_journal_begin_transaction(dns_journal_t *j) { * space. It will be filled in when the transaction is * finished. */ - memset(&hdr, 0, sizeof(hdr)); - CHECK(journal_write(j, &hdr, sizeof(hdr))); + CHECK(journal_write_xhdr(j, 0, 0, 0, 0)); j->x.pos[1].offset = j->offset; j->state = JOURNAL_STATE_TRANSACTION; From 520509ac7e8bd2fea27b937620688289c2e20b29 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 1 Apr 2021 15:30:42 +1100 Subject: [PATCH 2/6] Compute transaction size based on journal/transaction type previously the code assumed that it was a new transaction. --- lib/dns/journal.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/dns/journal.c b/lib/dns/journal.c index cbc5a1c7f2..0beea59ca9 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -1318,7 +1318,8 @@ dns_journal_commit(dns_journal_t *j) { if (j->state == JOURNAL_STATE_TRANSACTION) { isc_offset_t offset; offset = (j->x.pos[1].offset - j->x.pos[0].offset) - - sizeof(journal_rawxhdr_t); + (j->header_ver1 ? sizeof(journal_rawxhdr_ver1_t) + : sizeof(journal_rawxhdr_t)); /* * Update the transaction header. */ From 83310ffd92faa2777e3841f548a1cc12ddb5a8eb Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 31 Mar 2021 15:03:33 +1100 Subject: [PATCH 3/6] Update dns_journal_compact() to handle bad transaction headers Previously, dns_journal_begin_transaction() could reserve the wrong amount of space. We now check that the transaction is internally consistent when upgrading / downgrading a journal and we also handle the bad transaction headers. --- lib/dns/journal.c | 133 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 118 insertions(+), 15 deletions(-) diff --git a/lib/dns/journal.c b/lib/dns/journal.c index 0beea59ca9..b9318e8de6 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -945,6 +945,29 @@ journal_next(dns_journal_t *j, journal_pos_t *pos, bool retry) { ? sizeof(journal_rawxhdr_t) : sizeof(journal_rawxhdr_ver1_t); + /* + * Handle transaction header. + */ + if (j->header_ver1 && j->xhdr_version == XHDR_VERSION1) { + uint32_t value; + + CHECK(journal_read(j, &value, sizeof(value))); + if (value != 0L) { + CHECK(journal_seek(j, pos->offset + 12)); + } else { + j->recovered = true; + hdrsize += 4; + } + } else if (j->header_ver1 && j->xhdr_version == XHDR_VERSION2 && + xhdr.count == pos->serial && xhdr.serial1 == 0U && + isc_serial_ge(xhdr.serial0, xhdr.count)) + { + xhdr.serial1 = xhdr.serial0; + xhdr.serial0 = xhdr.count; + xhdr.count = 0; + j->recovered = true; + } + if ((isc_offset_t)(pos->offset + hdrsize + xhdr.size) < pos->offset) { isc_log_write(JOURNAL_COMMON_LOGARGS, ISC_LOG_ERROR, "%s: offset too large", j->filename); @@ -954,6 +977,9 @@ journal_next(dns_journal_t *j, journal_pos_t *pos, bool retry) { pos->offset += hdrsize + xhdr.size; pos->serial = xhdr.serial1; return (ISC_R_SUCCESS); + +failure: + return (result); } /* @@ -1976,6 +2002,30 @@ read_one_rr(dns_journal_t *j, bool retry) { xhdr.serial0); FAIL(ISC_R_UNEXPECTED); } + + /* + * Handle transaction header. + */ + if (j->header_ver1 && j->xhdr_version == XHDR_VERSION1) { + uint32_t value; + + CHECK(journal_read(j, &value, sizeof(value))); + if (value != 0L) { + CHECK(journal_seek(j, save.offset + 12)); + } else { + j->recovered = true; + } + } else if (j->header_ver1 && j->xhdr_version == XHDR_VERSION2 && + xhdr.count == j->it.current_serial && + xhdr.serial1 == 0U && + isc_serial_ge(xhdr.serial0, xhdr.count)) + { + xhdr.serial1 = xhdr.serial0; + xhdr.serial0 = xhdr.count; + xhdr.count = 0; + j->recovered = true; + } + j->it.xsize = xhdr.size; j->it.xpos = 0; } @@ -2389,7 +2439,7 @@ failure: } static uint32_t -rrcount(char *buf, unsigned int size) { +rrcount(unsigned char *buf, unsigned int size) { isc_buffer_t b; uint32_t rrsize, count = 0; @@ -2405,6 +2455,28 @@ rrcount(char *buf, unsigned int size) { return (count); } +static bool +check_delta(unsigned char *buf, size_t size) { + isc_buffer_t b; + uint32_t rrsize; + + isc_buffer_init(&b, buf, size); + isc_buffer_add(&b, size); + while (isc_buffer_remaininglength(&b) > 0) { + if (isc_buffer_remaininglength(&b) < 4) { + return (false); + } + rrsize = isc_buffer_getuint32(&b); + /* "." + type + class + ttl + rdlen => 11U */ + if (rrsize < 11U || isc_buffer_remaininglength(&b) < rrsize) { + return (false); + } + isc_buffer_forward(&b, rrsize); + } + + return (true); +} + isc_result_t dns_journal_compact(isc_mem_t *mctx, char *filename, uint32_t serial, uint32_t flags, uint32_t target_size) { @@ -2416,7 +2488,7 @@ dns_journal_compact(isc_mem_t *mctx, char *filename, uint32_t serial, journal_rawheader_t rawheader; unsigned int len; size_t namelen; - char *buf = NULL; + unsigned char *buf = NULL; unsigned int size = 0; isc_result_t result; unsigned int indexend; @@ -2573,22 +2645,22 @@ dns_journal_compact(isc_mem_t *mctx, char *filename, uint32_t serial, } CHECK(result); + size = xhdr.size; + buf = isc_mem_get(mctx, size); + result = journal_read(j1, buf, size); + /* * If we're repairing an outdated journal, the * xhdr format may be wrong. */ - if (rewrite && - (xhdr.serial0 != serial || - isc_serial_le(xhdr.serial1, xhdr.serial0))) - { - if (j1->xhdr_version == XHDR_VERSION2 && - xhdr.count == serial) { + if (rewrite && (result != ISC_R_SUCCESS || + !check_delta(buf, size))) { + if (j1->xhdr_version == XHDR_VERSION2) { /* XHDR_VERSION2 -> XHDR_VERSION1 */ j1->xhdr_version = XHDR_VERSION1; CHECK(journal_seek(j1, offset)); CHECK(journal_read_xhdr(j1, &xhdr)); - } else if (j1->xhdr_version == XHDR_VERSION1 && - xhdr.serial1 == serial) { + } else if (j1->xhdr_version == XHDR_VERSION1) { /* XHDR_VERSION1 -> XHDR_VERSION2 */ j1->xhdr_version = XHDR_VERSION2; CHECK(journal_seek(j1, offset)); @@ -2596,16 +2668,47 @@ dns_journal_compact(isc_mem_t *mctx, char *filename, uint32_t serial, } /* Check again */ - if (xhdr.serial0 != serial || - isc_serial_le(xhdr.serial1, xhdr.serial0)) { + isc_mem_put(mctx, buf, size); + size = xhdr.size; + buf = isc_mem_get(mctx, size); + CHECK(journal_read(j1, buf, size)); + + if (!check_delta(buf, size)) { CHECK(ISC_R_UNEXPECTED); } + } else { + CHECK(result); } - size = xhdr.size; - buf = isc_mem_get(mctx, size); - CHECK(journal_read(j1, buf, size)); + /* + * Recover from incorrectly written transaction header. + * The incorrect header was written as size, serial0, + * serial1, and 0. XHDR_VERSION2 is expecting size, + * count, serial0, and serial1. + */ + if (j1->xhdr_version == XHDR_VERSION2 && + xhdr.count == serial && xhdr.serial1 == 0U && + isc_serial_ge(xhdr.serial0, xhdr.count)) + { + xhdr.serial1 = xhdr.serial0; + xhdr.serial0 = xhdr.count; + xhdr.count = 0; + } + /* + * Check that xhdr is consistent. + */ + if (xhdr.serial0 != serial || + isc_serial_le(xhdr.serial1, xhdr.serial0)) { + CHECK(ISC_R_UNEXPECTED); + } + + /* + * Extract record count from the transaction. This + * is needed when converting from XHDR_VERSION1 to + * XHDR_VERSION2, and when recovering from an + * incorrectly written XHDR_VERSION2. + */ count = rrcount(buf, size); CHECK(journal_write_xhdr(j2, xhdr.size, count, xhdr.serial0, xhdr.serial1)); From 0fbdf189c7c51a5fe898faae4d6d71a5f2dc9979 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 1 Apr 2021 15:22:55 +1100 Subject: [PATCH 4/6] Rewrite managed-key journal immediately Both managed keys and regular zone journals need to be updated immediately when a recoverable error is discovered. --- lib/dns/zone.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index c9bca4bd94..5f042f4f63 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -5209,16 +5209,14 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime, result = ISC_R_SUCCESS; if (needdump) { - if (zone->type == dns_zone_key) { + if (fixjournal) { + DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_FIXJOURNAL); + zone_journal_compact(zone, zone->db, 0); + zone_needdump(zone, 0); + } else if (zone->type == dns_zone_key) { zone_needdump(zone, 30); } else { - if (fixjournal) { - DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_FIXJOURNAL); - zone_journal_compact(zone, zone->db, 0); - zone_needdump(zone, 0); - } else { - zone_needdump(zone, DNS_DUMP_DELAY); - } + zone_needdump(zone, DNS_DUMP_DELAY); } } From bb6f0faeed01623dd4526b188b44fe048083270a Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 1 Apr 2021 02:43:37 +1100 Subject: [PATCH 5/6] Check that upgrade of managed-keys.bind.jnl succeeded Update the system to include a recoverable managed.keys journal created with transactions and test that it has been updated as part of the start up process. --- bin/tests/system/journal/clean.sh | 6 +- .../system/journal/ns1/managed-keys.bind.in | 2 + .../journal/ns1/managed-keys.bind.jnl.in | 704 ++++++++++++++++++ bin/tests/system/journal/setup.sh | 3 + bin/tests/system/journal/tests.sh | 9 + 5 files changed, 722 insertions(+), 2 deletions(-) create mode 100644 bin/tests/system/journal/ns1/managed-keys.bind.in create mode 100644 bin/tests/system/journal/ns1/managed-keys.bind.jnl.in diff --git a/bin/tests/system/journal/clean.sh b/bin/tests/system/journal/clean.sh index 1b8649595a..189a5023c8 100644 --- a/bin/tests/system/journal/clean.sh +++ b/bin/tests/system/journal/clean.sh @@ -7,8 +7,10 @@ # See the COPYRIGHT file distributed with this work for additional # information regarding copyright ownership. +rm -f */*.db */*.jnl +rm -f */named.conf rm -f */named.memstats rm -f */named.run -rm -f */named.conf -rm -f */*.db */*.jnl rm -f dig.out* +rm -f journalprint.out.* +rm -f ns1/managed-keys.bind diff --git a/bin/tests/system/journal/ns1/managed-keys.bind.in b/bin/tests/system/journal/ns1/managed-keys.bind.in new file mode 100644 index 0000000000..923e98b751 --- /dev/null +++ b/bin/tests/system/journal/ns1/managed-keys.bind.in @@ -0,0 +1,2 @@ +. 0 IN SOA . . 3297 0 0 0 0 +. 0 IN TYPE65533 \# 276 60621140598E0A83000000000101030803010001ACFFB409BCC939F8 31F7A1E5EC88F7A59255EC53040BE432027390A4CE896D6F9086F3C5 E177FBFE118163AAEC7AF1462C47945944C4E2C026BE5E98BBCDED25 978272E1E3E079C5094D573F0E83C92F02B32D3513B1550B826929C8 0DD0F92CAC966D17769FD5867B647C3F38029ABDC48152EB8F207159 ECC5D232C7C1537C79F4B7AC28FF11682F21681BF6D6ABA555032BF6 F9F036BEB2AAA5B3778D6EEBFBA6BF9EA191BE4AB0CAEA759E2F773A 1F9029C73ECB8D5735B9321DB085F1B8E2D8038FE2941992548CEE0D 67DD4547E11DD63AF9C9FC1C5466FB684CF009D7197C2CF79E792AB5 01E6A8A1CA519AF2CB9B5F6367E94C0D47502451357BE1B5 diff --git a/bin/tests/system/journal/ns1/managed-keys.bind.jnl.in b/bin/tests/system/journal/ns1/managed-keys.bind.jnl.in new file mode 100644 index 0000000000..a63f91c93a --- /dev/null +++ b/bin/tests/system/journal/ns1/managed-keys.bind.jnl.in @@ -0,0 +1,704 @@ +3b42494e44204c4f472056390a000000 +00000cd20000020000000ce200002bf8 +00000038000000000000000000000000 +00000000000000000000000000000000 +00000cd20000020000000cd30000049c +00000cd40000073800000cd5000009d8 +00000cd600000c7800000cd700000f18 +00000cd8000011b800000cd900001458 +00000cda000016f800000cdb00001998 +00000cdc00001c3800000cdd00001ed8 +00000cde0000217800000cdf00002418 +00000ce0000026b800000ce100002958 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +00000000000000000000000000000000 +0000029000000cd200000cd300000021 +0000060001000000000016000000000c +d2000000000000000000000000000000 +000000011f00fffd0001000000000114 +6058a4c2598e0a830000000001010308 +03010001acffb409bcc939f831f7a1e5 +ec88f7a59255ec53040be432027390a4 +ce896d6f9086f3c5e177fbfe118163aa +ec7af1462c47945944c4e2c026be5e98 +bbcded25978272e1e3e079c5094d573f +0e83c92f02b32d3513b1550b826929c8 +0dd0f92cac966d17769fd5867b647c3f +38029abdc48152eb8f207159ecc5d232 +c7c1537c79f4b7ac28ff11682f21681b +f6d6aba555032bf6f9f036beb2aaa5b3 +778d6eebfba6bf9ea191be4ab0caea75 +9e2f773a1f9029c73ecb8d5735b9321d +b085f1b8e2d8038fe2941992548cee0d +67dd4547e11dd63af9c9fc1c5466fb68 +4cf009d7197c2cf79e792ab501e6a8a1 +ca519af2cb9b5f6367e94c0d47502451 +357be1b5000000210000060001000000 +000016000000000cd300000000000000 +0000000000000000000000011f00fffd +00010000000001146058e4a0598e0a83 +000000000101030803010001acffb409 +bcc939f831f7a1e5ec88f7a59255ec53 +040be432027390a4ce896d6f9086f3c5 +e177fbfe118163aaec7af1462c479459 +44c4e2c026be5e98bbcded25978272e1 +e3e079c5094d573f0e83c92f02b32d35 +13b1550b826929c80dd0f92cac966d17 +769fd5867b647c3f38029abdc48152eb +8f207159ecc5d232c7c1537c79f4b7ac +28ff11682f21681bf6d6aba555032bf6 +f9f036beb2aaa5b3778d6eebfba6bf9e +a191be4ab0caea759e2f773a1f9029c7 +3ecb8d5735b9321db085f1b8e2d8038f +e2941992548cee0d67dd4547e11dd63a +f9c9fc1c5466fb684cf009d7197c2cf7 +9e792ab501e6a8a1ca519af2cb9b5f63 +67e94c0d47502451357be1b500000290 +00000cd300000cd40000002100000600 +01000000000016000000000cd3000000 +00000000000000000000000000000001 +1f00fffd00010000000001146058e4a0 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cd40000000000000000000000 +00000000000000011f00fffd00010000 +000001146059f642598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cd4 +00000cd5000000000000002100000600 +01000000000016000000000cd4000000 +00000000000000000000000000000001 +1f00fffd00010000000001146059f642 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cd50000000000000000000000 +00000000000000011f00fffd00010000 +00000114605a283e598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cd5 +00000cd6000000000000002100000600 +01000000000016000000000cd5000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605a283e +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cd60000000000000000000000 +00000000000000011f00fffd00010000 +00000114605b47c2598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cd6 +00000cd7000000000000002100000600 +01000000000016000000000cd6000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605b47c2 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cd70000000000000000000000 +00000000000000011f00fffd00010000 +00000114605b79bf598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cd7 +00000cd8000000000000002100000600 +01000000000016000000000cd7000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605b79bf +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cd80000000000000000000000 +00000000000000011f00fffd00010000 +00000114605c9943598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cd8 +00000cd9000000000000002100000600 +01000000000016000000000cd8000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605c9943 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cd90000000000000000000000 +00000000000000011f00fffd00010000 +00000114605ccb40598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cd9 +00000cda000000000000002100000600 +01000000000016000000000cd9000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605ccb40 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cda0000000000000000000000 +00000000000000011f00fffd00010000 +00000114605deac4598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cda +00000cdb000000000000002100000600 +01000000000016000000000cda000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605deac4 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cdb0000000000000000000000 +00000000000000011f00fffd00010000 +00000114605e1cc0598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cdb +00000cdc000000000000002100000600 +01000000000016000000000cdb000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605e1cc0 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cdc0000000000000000000000 +00000000000000011f00fffd00010000 +00000114605efb3a598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cdc +00000cdd000000000000002100000600 +01000000000016000000000cdc000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605efb3a +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cdd0000000000000000000000 +00000000000000011f00fffd00010000 +00000114605f6e40598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cdd +00000cde000000000000002100000600 +01000000000016000000000cdd000000 +00000000000000000000000000000001 +1f00fffd0001000000000114605f6e40 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cde0000000000000000000000 +00000000000000011f00fffd00010000 +0000011460604cbb598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cde +00000cdf000000000000002100000600 +01000000000016000000000cde000000 +00000000000000000000000000000001 +1f00fffd000100000000011460604cbb +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000cdf0000000000000000000000 +00000000000000011f00fffd00010000 +000001146060bfc0598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000cdf +00000ce0000000000000002100000600 +01000000000016000000000cdf000000 +00000000000000000000000000000001 +1f00fffd00010000000001146060bfc0 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000ce00000000000000000000000 +00000000000000011f00fffd00010000 +0000011460619e3b598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000ce0 +00000ce1000000000000002100000600 +01000000000016000000000ce0000000 +00000000000000000000000000000001 +1f00fffd000100000000011460619e3b +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000ce10000000000000000000000 +00000000000000011f00fffd00010000 +0000011460621140598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b50000029000000ce1 +00000ce2000000000000002100000600 +01000000000016000000000ce1000000 +00000000000000000000000000000001 +1f00fffd000100000000011460621140 +598e0a83000000000101030803010001 +acffb409bcc939f831f7a1e5ec88f7a5 +9255ec53040be432027390a4ce896d6f +9086f3c5e177fbfe118163aaec7af146 +2c47945944c4e2c026be5e98bbcded25 +978272e1e3e079c5094d573f0e83c92f +02b32d3513b1550b826929c80dd0f92c +ac966d17769fd5867b647c3f38029abd +c48152eb8f207159ecc5d232c7c1537c +79f4b7ac28ff11682f21681bf6d6aba5 +55032bf6f9f036beb2aaa5b3778d6eeb +fba6bf9ea191be4ab0caea759e2f773a +1f9029c73ecb8d5735b9321db085f1b8 +e2d8038fe2941992548cee0d67dd4547 +e11dd63af9c9fc1c5466fb684cf009d7 +197c2cf79e792ab501e6a8a1ca519af2 +cb9b5f6367e94c0d47502451357be1b5 +00000021000006000100000000001600 +0000000ce20000000000000000000000 +00000000000000011f00fffd00010000 +000001146062efbb598e0a8300000000 +0101030803010001acffb409bcc939f8 +31f7a1e5ec88f7a59255ec53040be432 +027390a4ce896d6f9086f3c5e177fbfe +118163aaec7af1462c47945944c4e2c0 +26be5e98bbcded25978272e1e3e079c5 +094d573f0e83c92f02b32d3513b1550b +826929c80dd0f92cac966d17769fd586 +7b647c3f38029abdc48152eb8f207159 +ecc5d232c7c1537c79f4b7ac28ff1168 +2f21681bf6d6aba555032bf6f9f036be +b2aaa5b3778d6eebfba6bf9ea191be4a +b0caea759e2f773a1f9029c73ecb8d57 +35b9321db085f1b8e2d8038fe2941992 +548cee0d67dd4547e11dd63af9c9fc1c +5466fb684cf009d7197c2cf79e792ab5 +01e6a8a1ca519af2cb9b5f6367e94c0d +47502451357be1b5 diff --git a/bin/tests/system/journal/setup.sh b/bin/tests/system/journal/setup.sh index 23c963920f..2d74750df9 100644 --- a/bin/tests/system/journal/setup.sh +++ b/bin/tests/system/journal/setup.sh @@ -40,3 +40,6 @@ cp ns1/maxjournal.jnl.saved ns1/maxjournal.db.jnl cp ns1/generic.db.in ns1/maxjournal2.db cp ns1/maxjournal2.jnl.saved ns1/maxjournal2.db.jnl + +cp ns1/managed-keys.bind.in ns1/managed-keys.bind +$PERL ../../fromhex.pl < ns1/managed-keys.bind.jnl.in > ns1/managed-keys.bind.jnl diff --git a/bin/tests/system/journal/tests.sh b/bin/tests/system/journal/tests.sh index 7fd12dc14c..824c3723a2 100644 --- a/bin/tests/system/journal/tests.sh +++ b/bin/tests/system/journal/tests.sh @@ -150,6 +150,15 @@ c2=$(cat -v ns1/*.jnl | grep -c "BIND LOG V9.2") [ $ret -eq 0 ] || echo_i "failed" status=`expr $status + $ret` +n=`expr $n + 1` +echo_i "check upgrade of managed-keys.bind.jnl succeeded($n)" +ret=0 +$JOURNALPRINT ns1/managed-keys.bind.jnl > journalprint.out.test$n +lines=$(awk '$1 == "add" && $5 == "SOA" && $8 == "3297" { print }' journalprint.out.test$n | wc -l) +test $lines -eq 1 || ret=1 +[ $ret -eq 0 ] || echo_i "failed" +status=`expr $status + $ret` + n=`expr $n + 1` echo_i "check journal downgrade/upgrade ($n)" ret=0 From 0174098acafd9f559886b4e9039bb58bf40b3548 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 31 Mar 2021 15:15:19 +1100 Subject: [PATCH 6/6] Add CHANGES and release note for [GL #2600] --- CHANGES | 6 ++++++ doc/notes/notes-current.rst | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/CHANGES b/CHANGES index 22f8200293..29e2029f01 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +5613. [bug] It was possible to write an invalid transaction header + in the journal file for a managed-keys database after + upgrading. This has been fixed. Invalid headers in + existing journal files are detected and named is able + to recover from them. [GL #2600] + 5612. [bug] Continued refactoring of the network manager: - allow recovery from read and connect timeout events - ensure that calls to isc_nm_*connect() always diff --git a/doc/notes/notes-current.rst b/doc/notes/notes-current.rst index ec47cf85d1..cd3af2cb7b 100644 --- a/doc/notes/notes-current.rst +++ b/doc/notes/notes-current.rst @@ -74,3 +74,9 @@ Bug Fixes recursion for a client query completed when ``named`` was about to look for a stale answer, an assertion could fail in ``query_respond()``, resulting in a crash. This has been fixed. [GL #2594] + +- After upgrading to the previous release, journal files for trust anchor + databases (e.g., ``managed-keys.bind.jnl``) could be left in a corrupt + state. (Other zone journal files were not affected.) This has been + fixed. If a corrupt journal file is detected, ``named`` can now recover + from it. [GL #2600]