mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-13 17:00:49 +00:00
Compare commits
6
Commits
v2.93test6
...
v2.93test7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf08eeee12 | ||
|
|
0597828b74 | ||
|
|
c8168e888e | ||
|
|
3a052d55fb | ||
|
|
1eab169173 | ||
|
|
4070a74862 |
No files matched your search
@@ -94,6 +94,14 @@ static void null_hash_update(void *ctxv, size_t length, const uint8_t *src)
|
|||||||
ctx->len += length;
|
ctx->len += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The prototype changes in nettle 4.0 to omit the length argument */
|
||||||
|
#if MIN_VERSION(4, 0)
|
||||||
|
static void null_hash_digest(void *ctx, uint8_t *dst)
|
||||||
|
{
|
||||||
|
((struct null_hash_digest *)dst)->buff = null_hash_buff;
|
||||||
|
((struct null_hash_digest *)dst)->len = ((struct null_hash_ctx *)ctx)->len;
|
||||||
|
}
|
||||||
|
#else
|
||||||
static void null_hash_digest(void *ctx, size_t length, uint8_t *dst)
|
static void null_hash_digest(void *ctx, size_t length, uint8_t *dst)
|
||||||
{
|
{
|
||||||
(void)length;
|
(void)length;
|
||||||
@@ -101,6 +109,7 @@ static void null_hash_digest(void *ctx, size_t length, uint8_t *dst)
|
|||||||
((struct null_hash_digest *)dst)->buff = null_hash_buff;
|
((struct null_hash_digest *)dst)->buff = null_hash_buff;
|
||||||
((struct null_hash_digest *)dst)->len = ((struct null_hash_ctx *)ctx)->len;
|
((struct null_hash_digest *)dst)->len = ((struct null_hash_ctx *)ctx)->len;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct nettle_hash null_hash = {
|
static struct nettle_hash null_hash = {
|
||||||
"null_hash",
|
"null_hash",
|
||||||
@@ -501,4 +510,16 @@ const struct nettle_hash *hash_find(char *name)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The prototype changes in nettle 4.0 to omit the length argument */
|
||||||
|
void nettle_digest_wrapper(const struct nettle_hash *hash, void *ctx, size_t length, uint8_t *dst)
|
||||||
|
{
|
||||||
|
#if MIN_VERSION(4, 0)
|
||||||
|
(void)length;
|
||||||
|
hash->digest(ctx, dst);
|
||||||
|
#else
|
||||||
|
hash->digest(ctx, length, dst);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* defined(HAVE_DNSSEC) */
|
#endif /* defined(HAVE_DNSSEC) */
|
||||||
+1
-1
@@ -199,7 +199,7 @@ int main (int argc, char **argv)
|
|||||||
/* Must have at least a root trust anchor, or the DNSSEC code
|
/* Must have at least a root trust anchor, or the DNSSEC code
|
||||||
can loop forever. */
|
can loop forever. */
|
||||||
for (ds = daemon->ds; ds; ds = ds->next)
|
for (ds = daemon->ds; ds; ds = ds->next)
|
||||||
if (ds->name[0] == 0)
|
if (ds->name && ds->name[0] == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!ds)
|
if (!ds)
|
||||||
|
|||||||
@@ -1489,6 +1489,7 @@ int verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig,
|
|||||||
char *ds_digest_name(int digest);
|
char *ds_digest_name(int digest);
|
||||||
char *algo_digest_name(int algo);
|
char *algo_digest_name(int algo);
|
||||||
char *nsec3_digest_name(int digest);
|
char *nsec3_digest_name(int digest);
|
||||||
|
void nettle_digest_wrapper(const struct nettle_hash *hash, void *ctx, size_t length, uint8_t *dst);
|
||||||
|
|
||||||
/* util.c */
|
/* util.c */
|
||||||
void rand_init(void);
|
void rand_init(void);
|
||||||
|
|||||||
+4
-4
@@ -656,7 +656,7 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hash->digest(ctx, hash->digest_size, digest);
|
nettle_digest_wrapper(hash, ctx, hash->digest_size, digest);
|
||||||
|
|
||||||
/* namebuff used for workspace above, restore to leave unchanged on exit */
|
/* namebuff used for workspace above, restore to leave unchanged on exit */
|
||||||
p = (unsigned char*)(rrset[0]);
|
p = (unsigned char*)(rrset[0]);
|
||||||
@@ -836,7 +836,7 @@ int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, ch
|
|||||||
rather then O(keys x DSs) */
|
rather then O(keys x DSs) */
|
||||||
hash->update(ctx, (unsigned int)wire_len, (unsigned char *)name);
|
hash->update(ctx, (unsigned int)wire_len, (unsigned char *)name);
|
||||||
hash->update(ctx, (unsigned int)rdlen, psave);
|
hash->update(ctx, (unsigned int)rdlen, psave);
|
||||||
hash->digest(ctx, hash->digest_size, digest);
|
nettle_digest_wrapper(hash, ctx, hash->digest_size, digest);
|
||||||
|
|
||||||
from_wire(name);
|
from_wire(name);
|
||||||
|
|
||||||
@@ -1385,13 +1385,13 @@ static int hash_name(char *in, unsigned char **out, struct nettle_hash const *ha
|
|||||||
|
|
||||||
hash->update(ctx, to_wire(in), (unsigned char *)in);
|
hash->update(ctx, to_wire(in), (unsigned char *)in);
|
||||||
hash->update(ctx, salt_len, salt);
|
hash->update(ctx, salt_len, salt);
|
||||||
hash->digest(ctx, hash->digest_size, digest);
|
nettle_digest_wrapper(hash, ctx, hash->digest_size, digest);
|
||||||
|
|
||||||
for(i = 0; i < iterations; i++)
|
for(i = 0; i < iterations; i++)
|
||||||
{
|
{
|
||||||
hash->update(ctx, hash->digest_size, digest);
|
hash->update(ctx, hash->digest_size, digest);
|
||||||
hash->update(ctx, salt_len, salt);
|
hash->update(ctx, salt_len, salt);
|
||||||
hash->digest(ctx, hash->digest_size, digest);
|
nettle_digest_wrapper(hash, ctx, hash->digest_size, digest);
|
||||||
}
|
}
|
||||||
|
|
||||||
from_wire(in);
|
from_wire(in);
|
||||||
|
|||||||
+3
-1
@@ -79,7 +79,9 @@ void build_server_array(void)
|
|||||||
for (serv = daemon->local_domains; serv; serv = serv->next, count++)
|
for (serv = daemon->local_domains; serv; serv = serv->next, count++)
|
||||||
daemon->serverarray[count] = serv;
|
daemon->serverarray[count] = serv;
|
||||||
|
|
||||||
qsort(daemon->serverarray, daemon->serverarraysz, sizeof(struct server *), order_qsort);
|
/* serverarray may be unallocated if we have no servers yet. */
|
||||||
|
if (daemon->serverarray)
|
||||||
|
qsort(daemon->serverarray, daemon->serverarraysz, sizeof(struct server *), order_qsort);
|
||||||
|
|
||||||
/* servers need the location in the array to find all the whole
|
/* servers need the location in the array to find all the whole
|
||||||
set of equivalent servers from a pointer to a single one. */
|
set of equivalent servers from a pointer to a single one. */
|
||||||
|
|||||||
+14
-12
@@ -2442,10 +2442,10 @@ void tcp_request(int confd, time_t now, struct iovec *bigbuff,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
/* Now get the query into the normal UDP packet buffer.
|
/* Now get the query into the normal UDP packet buffer.
|
||||||
Ignore queries long than this. If we're answering locally,
|
Ignore queries longer than this. If we're answering locally,
|
||||||
copy the query into the output buffer, but for forwarding, tcp_talk()
|
copy the query into the output buffer, but for forwarding, tcp_talk()
|
||||||
wants the query in a a different buffer from the reply.
|
wants the query in different buffer from the reply.
|
||||||
Note that we overwrote any saved UDP query - this onlt matters in debug mode. */
|
Note that we overwrote any saved UDP query - this only matters in debug mode. */
|
||||||
daemon->srv_save = NULL;
|
daemon->srv_save = NULL;
|
||||||
if (!read_write(confd, (unsigned char *)&tcp_len, sizeof(tcp_len), RW_READ) ||
|
if (!read_write(confd, (unsigned char *)&tcp_len, sizeof(tcp_len), RW_READ) ||
|
||||||
!(size = ntohs(tcp_len)) || size > (size_t)daemon->packet_buff_sz ||
|
!(size = ntohs(tcp_len)) || size > (size_t)daemon->packet_buff_sz ||
|
||||||
@@ -2461,6 +2461,15 @@ void tcp_request(int confd, time_t now, struct iovec *bigbuff,
|
|||||||
|
|
||||||
/* header == query */
|
/* header == query */
|
||||||
header = (struct dns_header *)daemon->packet;
|
header = (struct dns_header *)daemon->packet;
|
||||||
|
|
||||||
|
/* Add edns0 pheader to query */
|
||||||
|
size = add_edns0_config(header, size, ((unsigned char *) header) + daemon->edns_pktsz, &peer_addr, now, &cacheable);
|
||||||
|
|
||||||
|
/* Clear buffer to avoid risk of information disclosure. */
|
||||||
|
memset(bigbuff->iov_base, 0, bigbuff->iov_len);
|
||||||
|
/* Copy query into output buffer for local answering */
|
||||||
|
memcpy(out_header, header, size);
|
||||||
|
|
||||||
query_count++;
|
query_count++;
|
||||||
|
|
||||||
/* log_query gets called indirectly all over the place, so
|
/* log_query gets called indirectly all over the place, so
|
||||||
@@ -2493,13 +2502,6 @@ void tcp_request(int confd, time_t now, struct iovec *bigbuff,
|
|||||||
do_bit = 1; /* do bit */
|
do_bit = 1; /* do bit */
|
||||||
}
|
}
|
||||||
|
|
||||||
size = add_edns0_config(header, size, ((unsigned char *) header) + daemon->edns_pktsz, &peer_addr, now, &cacheable);
|
|
||||||
|
|
||||||
/* Clear buffer to avoid risk of information disclosure. */
|
|
||||||
memset(bigbuff->iov_base, 0, bigbuff->iov_len);
|
|
||||||
/* Copy query into output buffer for local answering */
|
|
||||||
memcpy(out_header, header, size);
|
|
||||||
|
|
||||||
log_query_mysockaddr((auth_dns ? F_NOERR | F_AUTH : 0) | F_QUERY | F_FORWARD, daemon->namebuff,
|
log_query_mysockaddr((auth_dns ? F_NOERR | F_AUTH : 0) | F_QUERY | F_FORWARD, daemon->namebuff,
|
||||||
&peer_addr, NULL, qtype);
|
&peer_addr, NULL, qtype);
|
||||||
|
|
||||||
@@ -2552,7 +2554,7 @@ void tcp_request(int confd, time_t now, struct iovec *bigbuff,
|
|||||||
else if (!allowed)
|
else if (!allowed)
|
||||||
{
|
{
|
||||||
ede = EDE_BLOCKED;
|
ede = EDE_BLOCKED;
|
||||||
m = answer_disallowed(header, size, (u32)mark, daemon->namebuff);
|
m = answer_disallowed(out_header, size, (u32)mark, daemon->namebuff);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_AUTH
|
#ifdef HAVE_AUTH
|
||||||
@@ -2568,7 +2570,7 @@ void tcp_request(int confd, time_t now, struct iovec *bigbuff,
|
|||||||
/* Do this by steam now we're not in the select() loop */
|
/* Do this by steam now we're not in the select() loop */
|
||||||
check_log_writer(1);
|
check_log_writer(1);
|
||||||
|
|
||||||
if (m == 0 && ede == EDE_UNSET)
|
if (!flags && m == 0 && ede == EDE_UNSET)
|
||||||
{
|
{
|
||||||
struct server *master;
|
struct server *master;
|
||||||
int start;
|
int start;
|
||||||
|
|||||||
+23
-5
@@ -40,6 +40,7 @@ static void log6_opts(int nest, unsigned int xid, void *start_opts, void *end_op
|
|||||||
static void log6_packet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
static void log6_packet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
||||||
static void log6_quiet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
static void log6_quiet(struct state *state, char *type, struct in6_addr *addr, char *string);
|
||||||
static void *opt6_find (uint8_t *opts, uint8_t *end, unsigned int search, unsigned int minsize);
|
static void *opt6_find (uint8_t *opts, uint8_t *end, unsigned int search, unsigned int minsize);
|
||||||
|
static void *opt6_first(uint8_t *opt, uint8_t *end);
|
||||||
static void *opt6_next(uint8_t *opts, uint8_t *end);
|
static void *opt6_next(uint8_t *opts, uint8_t *end);
|
||||||
static unsigned int opt6_uint(unsigned char *opt, int offset, int size);
|
static unsigned int opt6_uint(unsigned char *opt, int offset, int size);
|
||||||
static void get_context_tag(struct state *state, struct dhcp_context *context);
|
static void get_context_tag(struct state *state, struct dhcp_context *context);
|
||||||
@@ -112,11 +113,18 @@ static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t
|
|||||||
{
|
{
|
||||||
uint8_t *end = inbuff + sz;
|
uint8_t *end = inbuff + sz;
|
||||||
uint8_t *opts = inbuff + 34;
|
uint8_t *opts = inbuff + 34;
|
||||||
int msg_type = *inbuff;
|
int msg_type;
|
||||||
unsigned char *outmsgtypep;
|
unsigned char *outmsgtypep;
|
||||||
uint8_t *opt;
|
uint8_t *opt;
|
||||||
struct dhcp_vendor *vendor;
|
struct dhcp_vendor *vendor;
|
||||||
|
|
||||||
|
/* must have at least msg_type+trans_id
|
||||||
|
which is 1 + 3 = 4 */
|
||||||
|
if (sz < 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
msg_type = *inbuff;
|
||||||
|
|
||||||
/* if not an encapsulated relayed message, just do the stuff */
|
/* if not an encapsulated relayed message, just do the stuff */
|
||||||
if (msg_type != DHCP6RELAYFORW)
|
if (msg_type != DHCP6RELAYFORW)
|
||||||
{
|
{
|
||||||
@@ -233,11 +241,8 @@ static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t
|
|||||||
memcpy(&state->mac[0], opt6_ptr(opt, 2), state->mac_len);
|
memcpy(&state->mac[0], opt6_ptr(opt, 2), state->mac_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (opt = opts; opt; opt = opt6_next(opt, end))
|
for (opt = opt6_first(opts, end); opt; opt = opt6_next(opt, end))
|
||||||
{
|
{
|
||||||
if ((uint8_t *)opt6_ptr(opt, 0) + opt6_len(opt) > end)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Don't copy MAC address into reply. */
|
/* Don't copy MAC address into reply. */
|
||||||
if (opt6_type(opt) != OPTION6_CLIENT_MAC)
|
if (opt6_type(opt) != OPTION6_CLIENT_MAC)
|
||||||
{
|
{
|
||||||
@@ -2113,6 +2118,19 @@ static void *opt6_find (uint8_t *opts, uint8_t *end, unsigned int search, unsign
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *opt6_first(uint8_t *opt, uint8_t *end)
|
||||||
|
{
|
||||||
|
/* make sure we have option number and length. */
|
||||||
|
if ((uint8_t *)opt6_ptr(opt, 0) > end)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* make sure we have bytes promised by length. */
|
||||||
|
if ((uint8_t *)opt6_ptr(opt, opt6_len(opt)) > end)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return opt;
|
||||||
|
}
|
||||||
|
|
||||||
static void *opt6_next(uint8_t *opts, uint8_t *end)
|
static void *opt6_next(uint8_t *opts, uint8_t *end)
|
||||||
{
|
{
|
||||||
u16 opt_len;
|
u16 opt_len;
|
||||||
|
|||||||
Reference in new issue
Block a user