~ubuntu-branches/ubuntu/natty/bind9/natty-updates

« back to all changes in this revision

Viewing changes to lib/dns/nsec3.c

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones, Internet Software Consortium, Inc, LaMont Jones
  • Date: 2010-06-21 09:53:30 UTC
  • mfrom: (1.6.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20100621095330-k6874kbj59lfo3xm
Tags: 1:9.7.1.dfsg-1
[Internet Software Consortium, Inc]

* 9.7.1

[LaMont Jones]

* Add freebsd support.  Closes: #578447
* soname changes
* freshen root cache.  LP: #596363

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
 * PERFORMANCE OF THIS SOFTWARE.
15
15
 */
16
16
 
17
 
/* $Id: nsec3.c,v 1.13.6.2 2010/01/04 23:48:10 tbox Exp $ */
 
17
/* $Id: nsec3.c,v 1.13.6.5 2010/06/02 00:41:34 marka Exp $ */
18
18
 
19
19
#include <config.h>
20
20
 
28
28
#include <dst/dst.h>
29
29
 
30
30
#include <dns/db.h>
 
31
#include <dns/zone.h>
31
32
#include <dns/compress.h>
32
33
#include <dns/dbiterator.h>
33
34
#include <dns/diff.h>
1004
1005
        ISC_LINK_INIT(target, link);
1005
1006
}
1006
1007
 
 
1008
#ifdef BIND9
 
1009
static isc_result_t
 
1010
rr_exists(dns_db_t *db, dns_dbversion_t *ver, dns_name_t *name,
 
1011
          const dns_rdata_t *rdata, isc_boolean_t *flag)
 
1012
{
 
1013
        dns_rdataset_t rdataset;
 
1014
        dns_dbnode_t *node = NULL;
 
1015
        isc_result_t result;
 
1016
 
 
1017
        dns_rdataset_init(&rdataset);
 
1018
        if (rdata->type == dns_rdatatype_nsec3)
 
1019
                CHECK(dns_db_findnsec3node(db, name, ISC_FALSE, &node));
 
1020
        else
 
1021
                CHECK(dns_db_findnode(db, name, ISC_FALSE, &node));
 
1022
        result = dns_db_findrdataset(db, node, ver, rdata->type, 0,
 
1023
                                     (isc_stdtime_t) 0, &rdataset, NULL);
 
1024
        if (result == ISC_R_NOTFOUND) {
 
1025
                *flag = ISC_FALSE;
 
1026
                result = ISC_R_SUCCESS;
 
1027
                goto failure;
 
1028
        }
 
1029
 
 
1030
        for (result = dns_rdataset_first(&rdataset);
 
1031
             result == ISC_R_SUCCESS;
 
1032
             result = dns_rdataset_next(&rdataset)) {
 
1033
                dns_rdata_t myrdata = DNS_RDATA_INIT;
 
1034
                dns_rdataset_current(&rdataset, &myrdata);
 
1035
                if (!dns_rdata_casecompare(&myrdata, rdata))
 
1036
                        break;
 
1037
        }
 
1038
        dns_rdataset_disassociate(&rdataset);
 
1039
        if (result == ISC_R_SUCCESS) {
 
1040
                *flag = ISC_TRUE;
 
1041
        } else if (result == ISC_R_NOMORE) {
 
1042
                *flag = ISC_FALSE;
 
1043
                result = ISC_R_SUCCESS;
 
1044
        }
 
1045
 
 
1046
 failure:
 
1047
        if (node != NULL)
 
1048
                dns_db_detachnode(db, &node);
 
1049
        return (result);
 
1050
}
 
1051
#endif
 
1052
 
 
1053
#ifdef BIND9
 
1054
isc_result_t
 
1055
dns_nsec3param_deletechains(dns_db_t *db, dns_dbversion_t *ver,
 
1056
                            dns_zone_t *zone, dns_diff_t *diff)
 
1057
{
 
1058
        dns_dbnode_t *node = NULL;
 
1059
        dns_difftuple_t *tuple = NULL;
 
1060
        dns_name_t next;
 
1061
        dns_rdata_t rdata = DNS_RDATA_INIT;
 
1062
        dns_rdataset_t rdataset;
 
1063
        isc_boolean_t flag;
 
1064
        isc_result_t result = ISC_R_SUCCESS;
 
1065
        unsigned char buf[DNS_NSEC3PARAM_BUFFERSIZE + 1];
 
1066
        dns_name_t *origin = dns_zone_getorigin(zone);
 
1067
        dns_rdatatype_t privatetype = dns_zone_getprivatetype(zone);
 
1068
 
 
1069
        dns_name_init(&next, NULL);
 
1070
        dns_rdataset_init(&rdataset);
 
1071
 
 
1072
        result = dns_db_getoriginnode(db, &node);
 
1073
        if (result != ISC_R_SUCCESS)
 
1074
                return (result);
 
1075
 
 
1076
        /*
 
1077
         * Cause all NSEC3 chains to be deleted.
 
1078
         */
 
1079
        result = dns_db_findrdataset(db, node, ver, dns_rdatatype_nsec3param,
 
1080
                                     0, (isc_stdtime_t) 0, &rdataset, NULL);
 
1081
        if (result == ISC_R_NOTFOUND)
 
1082
                goto try_private;
 
1083
        if (result != ISC_R_SUCCESS)
 
1084
                goto failure;
 
1085
 
 
1086
        for (result = dns_rdataset_first(&rdataset);
 
1087
             result == ISC_R_SUCCESS;
 
1088
             result = dns_rdataset_next(&rdataset)) {
 
1089
                dns_rdata_t private = DNS_RDATA_INIT;
 
1090
 
 
1091
                dns_rdataset_current(&rdataset, &rdata);
 
1092
 
 
1093
                CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL, origin,
 
1094
                                           rdataset.ttl, &rdata, &tuple));
 
1095
                CHECK(do_one_tuple(&tuple, db, ver, diff));
 
1096
                INSIST(tuple == NULL);
 
1097
 
 
1098
                dns_nsec3param_toprivate(&rdata, &private, privatetype,
 
1099
                                         buf, sizeof(buf));
 
1100
                buf[2] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
 
1101
 
 
1102
                CHECK(rr_exists(db, ver, origin, &private, &flag));
 
1103
 
 
1104
                if (!flag) {
 
1105
                        CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
 
1106
                                                   origin, 0, &private,
 
1107
                                                   &tuple));
 
1108
                        CHECK(do_one_tuple(&tuple, db, ver, diff));
 
1109
                        INSIST(tuple == NULL);
 
1110
                }
 
1111
                dns_rdata_reset(&rdata);
 
1112
        }
 
1113
        if (result != ISC_R_NOMORE)
 
1114
                goto failure;
 
1115
 
 
1116
        dns_rdataset_disassociate(&rdataset);
 
1117
 
 
1118
 try_private:
 
1119
        if (privatetype == 0)
 
1120
                goto success;
 
1121
        result = dns_db_findrdataset(db, node, ver, privatetype, 0,
 
1122
                                     (isc_stdtime_t) 0, &rdataset, NULL);
 
1123
        if (result == ISC_R_NOTFOUND)
 
1124
                goto success;
 
1125
        if (result != ISC_R_SUCCESS)
 
1126
                goto failure;
 
1127
 
 
1128
        for (result = dns_rdataset_first(&rdataset);
 
1129
             result == ISC_R_SUCCESS;
 
1130
             result = dns_rdataset_next(&rdataset)) {
 
1131
                dns_rdataset_current(&rdataset, &rdata);
 
1132
                INSIST(rdata.length <= sizeof(buf));
 
1133
                memcpy(buf, rdata.data, rdata.length);
 
1134
 
 
1135
                if (buf[0] != 0 ||
 
1136
                    buf[2] == (DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC)) {
 
1137
                        dns_rdata_reset(&rdata);
 
1138
                        continue;
 
1139
                }
 
1140
 
 
1141
                CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_DEL, origin,
 
1142
                                           0, &rdata, &tuple));
 
1143
                CHECK(do_one_tuple(&tuple, db, ver, diff));
 
1144
                INSIST(tuple == NULL);
 
1145
 
 
1146
                buf[2] = DNS_NSEC3FLAG_REMOVE | DNS_NSEC3FLAG_NONSEC;
 
1147
 
 
1148
                CHECK(rr_exists(db, ver, origin, &rdata, &flag));
 
1149
 
 
1150
                if (!flag) {
 
1151
                        CHECK(dns_difftuple_create(diff->mctx, DNS_DIFFOP_ADD,
 
1152
                                                   origin, 0, &rdata, &tuple));
 
1153
                        CHECK(do_one_tuple(&tuple, db, ver, diff));
 
1154
                        INSIST(tuple == NULL);
 
1155
                }
 
1156
                dns_rdata_reset(&rdata);
 
1157
        }
 
1158
        if (result != ISC_R_NOMORE)
 
1159
                goto failure;
 
1160
 success:
 
1161
        result = ISC_R_SUCCESS;
 
1162
 
 
1163
 failure:
 
1164
        if (dns_rdataset_isassociated(&rdataset))
 
1165
                dns_rdataset_disassociate(&rdataset);
 
1166
        dns_db_detachnode(db, &node);
 
1167
        return (result);
 
1168
}
 
1169
#endif
 
1170
 
1007
1171
isc_result_t
1008
1172
dns_nsec3_addnsec3sx(dns_db_t *db, dns_dbversion_t *version,
1009
1173
                     dns_name_t *name, dns_ttl_t nsecttl,