Commit 9d633048 authored by Simon Kelley's avatar Simon Kelley

Saving progress

parent a9b55837
...@@ -82,6 +82,8 @@ struct dns_header { ...@@ -82,6 +82,8 @@ struct dns_header {
#define HB4_RCODE 0x0f #define HB4_RCODE 0x0f
#define OPCODE(x) (((x)->hb3 & HB3_OPCODE) >> 3) #define OPCODE(x) (((x)->hb3 & HB3_OPCODE) >> 3)
#define SET_OPCODE(x, code) (x)->hb3 = ((x)->hb3 & ~HB3_OPCODE) | code
#define RCODE(x) ((x)->hb4 & HB4_RCODE) #define RCODE(x) ((x)->hb4 & HB4_RCODE)
#define SET_RCODE(x, code) (x)->hb4 = ((x)->hb4 & ~HB4_RCODE) | code #define SET_RCODE(x, code) (x)->hb4 = ((x)->hb4 & ~HB4_RCODE) | code
......
...@@ -511,9 +511,8 @@ struct hostsfile { ...@@ -511,9 +511,8 @@ struct hostsfile {
#define FREC_NOREBIND 1 #define FREC_NOREBIND 1
#define FREC_CHECKING_DISABLED 2 #define FREC_CHECKING_DISABLED 2
#define FREC_HAS_SUBNET 4 #define FREC_HAS_SUBNET 4
#define FREC_DNSSEC_QUERY 8 #define FREC_DNSKEY_QUERY 8
#define FREC_DNSKEY_QUERY 16 #define FREC_DS_QUERY 16
#define FREC_DS_QUERY 32
struct frec { struct frec {
union mysockaddr source; union mysockaddr source;
......
...@@ -677,7 +677,16 @@ void reply_query(int fd, int family, time_t now) ...@@ -677,7 +677,16 @@ void reply_query(int fd, int family, time_t now)
#ifdef HAVE_DNSSEC #ifdef HAVE_DNSSEC
if (option_bool(OPT_DNSSEC_VALID) && !(forward->flags & FREC_CHECKING_DISABLED)) if (option_bool(OPT_DNSSEC_VALID) && !(forward->flags & FREC_CHECKING_DISABLED))
{ {
int status = dnssec_validate(forward->flags, header, n); int status;
char rrbitmap[256/8];
int class;
if (forward->flags && FREC_DNSSKEY_QUERY)
status = dnssec_validate_by_ds(header, n, daemon->namebuff, &class);
else if (forward->flags && FREC_DS_QUERY)
status = dnssec_validate_dnskey(header, n, daemon->namebuff, &class);
else
status = dnssec_validate_reply(&rrbitmap, header, n, daemon->namebuff, &class);
/* Can't validate, as we're missing key data. Put this /* Can't validate, as we're missing key data. Put this
answer aside, whilst we get that. */ answer aside, whilst we get that. */
...@@ -687,26 +696,29 @@ void reply_query(int fd, int family, time_t now) ...@@ -687,26 +696,29 @@ void reply_query(int fd, int family, time_t now)
if ((forward->stash = blockdata_alloc((char *)header, n))) if ((forward->stash = blockdata_alloc((char *)header, n)))
{ {
forward->stash_len = n; forward->stash_len = n;
/* Now formulate a query for the missing data. */ if ((new = get_new_frec(now, NULL, 1)))
nn = dnssec_generate_query(header, status);
new = get_new_frec(now, NULL, 1);
if (new)
{ {
int fd; int fd;
new = forward; /* copy everything, then overwrite */ new = forward; /* copy everything, then overwrite */
new->dependent = forward; /* to find query awaiting new one. */ new->dependent = forward; /* to find query awaiting new one. */
forward->blocking_query = new; /* for garbage cleaning */ forward->blocking_query = new; /* for garbage cleaning */
new->flags |= FREC_DNSSEC_QUERY; /* validate routines leave name of required record in daemon->namebuff */
if (status == STAT_NEED_KEY) if (status == STAT_NEED_KEY)
new->flags |= FREC_DNSKEY_QUERY; /* So we verify differently */ {
new->flags |= FREC_DNSKEY_QUERY;
nn = dnssec_generate_query(header, daemon->namebuff, class, T_DNSKEY);
}
else if (status == STAT_NEED_DS) else if (status == STAT_NEED_DS)
new->flags |= FREC_DS_QUERY; {
new->flags |= FREC_DS_QUERY;
nn = dnssec_generate_query(header, daemon->namebuff, class, T_DS);
}
new->crc = questions_crc(header, nn, daemon->namebuff); new->crc = questions_crc(header, nn, daemon->namebuff);
new->new_id = get_id(new->crc); new->new_id = get_id(new->crc);
header->id = htons(new->id);
/* Don't resend this. */ /* Don't resend this. */
daemon->srv_save = NULL; daemon->srv_save = NULL;
...@@ -714,19 +726,19 @@ void reply_query(int fd, int family, time_t now) ...@@ -714,19 +726,19 @@ void reply_query(int fd, int family, time_t now)
fd = server->sfd->fd; fd = server->sfd->fd;
else else
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
/* Note that we use the same random port for the DNSSEC stuff */ /* Note that we use the same random port for the DNSSEC stuff */
if (server->addr.sa.sa_family == AF_INET6) if (server->addr.sa.sa_family == AF_INET6)
{ {
fd = new->rfd6->fd; fd = new->rfd6->fd;
new->rfd6->refcount++; new->rfd6->refcount++;
} }
else else
#endif #endif
{ {
fd = new->rfd4->fd; fd = new->rfd4->fd;
new->rfd4->refcount++; new->rfd4->refcount++;
} }
/* Send DNSSEC query to same server as original query */ /* Send DNSSEC query to same server as original query */
while (sendto(fd, (char *)header, nn, 0, &server->addr.sa, sa_len(&server->addr)) == -1 && retry_send()); while (sendto(fd, (char *)header, nn, 0, &server->addr.sa, sa_len(&server->addr)) == -1 && retry_send());
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment