compress.c revision 5e93bad21b6d68fce862ff8aace3bb29b658f4f6
45c5f403619029a363cf089e0a4b1bb44425dd84Tinderbox User * Copyright (C) 2004-2007, 2015 Internet Systems Consortium, Inc. ("ISC")
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * Copyright (C) 1999-2001 Internet Software Consortium.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and/or distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * copyright notice and this permission notice appear in all copies.
2f4561bc9cd5e5cdc58e29e600303c812f6902eeAutomatic Updater * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * PERFORMANCE OF THIS SOFTWARE.
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt#define VALID_CCTX(x) ISC_MAGIC_VALID(x, CCTX_MAGIC)
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt#define VALID_DCTX(x) ISC_MAGIC_VALID(x, DCTX_MAGIC)
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt *** Compression
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Huntdns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx) {
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt unsigned int i;
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt REQUIRE(mctx != NULL); /* See: rdataset.c:towiresorted(). */
e11a0c114cdaf8f7e7832e9f1a011138248093a6Evan Hunt for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++)
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt unsigned int i;
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) {
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Huntdns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed) {
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Huntdns_compress_setsensitive(dns_compress_t *cctx, isc_boolean_t sensitive) {
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt return (ISC_TF((cctx->allowed & DNS_COMPRESS_CASESENSITIVE) != 0));
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * Find the longest match of name in the table.
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * If match is found return ISC_TRUE. prefix, suffix and offset are updated.
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Hunt * If no match is found return ISC_FALSE.
e11a0c114cdaf8f7e7832e9f1a011138248093a6Evan Huntdns_compress_findglobal(dns_compress_t *cctx, const dns_name_t *name,
e11a0c114cdaf8f7e7832e9f1a011138248093a6Evan Hunt dns_name_getlabelsequence(name, n, labels - n, &tname);
e11a0c114cdaf8f7e7832e9f1a011138248093a6Evan Hunt for (node = cctx->table[hash]; node != NULL; node = node->next)
e11a0c114cdaf8f7e7832e9f1a011138248093a6Evan Hunt if ((cctx->allowed & DNS_COMPRESS_CASESENSITIVE) != 0) {
e11a0c114cdaf8f7e7832e9f1a011138248093a6Evan Hunt * If node == NULL, we found no match at all.
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Huntstatic inline unsigned int
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Huntdns_compress_add(dns_compress_t *cctx, const dns_name_t *name,
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt unsigned int start;
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt unsigned int n;
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt unsigned int count;
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt unsigned int hash;
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt unsigned int length;
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt unsigned int tlength;
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt unsigned char *tmp;
e939674d53a127ddeeaf4b41fd72933f0b493308Mark Andrews while (count > 0) {
e939674d53a127ddeeaf4b41fd72933f0b493308Mark Andrews dns_name_getlabelsequence(&xname, start, n, &tname);
e939674d53a127ddeeaf4b41fd72933f0b493308Mark Andrews toffset = (isc_uint16_t)(offset + (length - tlength));
0d6328ce5f6b799f8e7c6cbbb3b965cf29bfb7baMark Andrews * Create a new node and add it.
677f507de7c546c187c1505c48bc7b440545485cMark Andrews node->labels = (isc_uint8_t)dns_name_countlabels(&tname);
75b8de87879ad017c9cd2ffc328e5d2391d16e99Evan Huntdns_compress_rollback(dns_compress_t *cctx, isc_uint16_t offset) {
for (i = 0; i < DNS_COMPRESS_TABLESIZE; i++) {
case DNS_DECOMPRESS_ANY:
case DNS_DECOMPRESS_NONE:
case DNS_DECOMPRESS_STRICT: