mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-10 16:31:00 +00:00
Compare commits
8
Commits
v2.93test2
...
v2.93test3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fbfcf87f8b | ||
|
|
19f3e06e7a | ||
|
|
40d1152059 | ||
|
|
3c830c4f1c | ||
|
|
e9f400dd37 | ||
|
|
870f14108f | ||
|
|
714d36229a | ||
|
|
60e90e2224 |
No files matched your search
+6
-8
@@ -193,22 +193,20 @@ void *blockdata_retrieve(struct blockdata *block, size_t len, void *data)
|
|||||||
{
|
{
|
||||||
size_t blen;
|
size_t blen;
|
||||||
struct blockdata *b;
|
struct blockdata *b;
|
||||||
uint8_t *new, *d;
|
uint8_t *d;
|
||||||
|
|
||||||
static unsigned int buff_len = 0;
|
|
||||||
static unsigned char *buff = NULL;
|
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
{
|
{
|
||||||
|
static unsigned int buff_len = 0;
|
||||||
|
static unsigned char *buff = NULL;
|
||||||
|
uint8_t *new;
|
||||||
|
|
||||||
if (len > buff_len)
|
if (len > buff_len)
|
||||||
{
|
{
|
||||||
blen = len + 1024;
|
blen = len + 1024;
|
||||||
if (!(new = whine_malloc(blen)))
|
if (!(new = whine_realloc(buff, blen)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (buff)
|
|
||||||
free(buff);
|
|
||||||
|
|
||||||
buff = new;
|
buff = new;
|
||||||
buff_len = blen;
|
buff_len = blen;
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-9
@@ -1450,8 +1450,6 @@ void send_event(int fd, int event, int data, char *msg)
|
|||||||
while (writev(fd, iov, msg ? 2 : 1) == -1 && errno == EINTR);
|
while (writev(fd, iov, msg ? 2 : 1) == -1 && errno == EINTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: the memory used to return msg is leaked: use msgs in events only
|
|
||||||
to describe fatal errors. */
|
|
||||||
static int read_event(int fd, struct event_desc *evp, char **msg)
|
static int read_event(int fd, struct event_desc *evp, char **msg)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
@@ -1461,13 +1459,23 @@ static int read_event(int fd, struct event_desc *evp, char **msg)
|
|||||||
|
|
||||||
*msg = NULL;
|
*msg = NULL;
|
||||||
|
|
||||||
if (evp->msg_sz != 0 &&
|
if (evp->msg_sz != 0)
|
||||||
(buf = malloc(evp->msg_sz + 1)) &&
|
{
|
||||||
read_write(fd, (unsigned char *)buf, evp->msg_sz, RW_READ))
|
if (!(buf = whine_malloc(evp->msg_sz + 1)))
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned char a;
|
||||||
|
|
||||||
|
/* Keep the stream synchronised if malloc fails. */
|
||||||
|
for (i = 0; i < evp->msg_sz; i++)
|
||||||
|
read_write(fd, &a, 1, RW_READ);
|
||||||
|
}
|
||||||
|
else if (read_write(fd, (unsigned char *)buf, evp->msg_sz, RW_READ))
|
||||||
{
|
{
|
||||||
buf[evp->msg_sz] = 0;
|
buf[evp->msg_sz] = 0;
|
||||||
*msg = buf;
|
*msg = buf;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1529,9 +1537,6 @@ static void async_event(int pipe, time_t now)
|
|||||||
int wstatus, i, check = 0;
|
int wstatus, i, check = 0;
|
||||||
char *msg;
|
char *msg;
|
||||||
|
|
||||||
/* NOTE: the memory used to return msg is leaked: use msgs in events only
|
|
||||||
to describe fatal errors. */
|
|
||||||
|
|
||||||
if (read_event(pipe, &ev, &msg))
|
if (read_event(pipe, &ev, &msg))
|
||||||
switch (ev.event)
|
switch (ev.event)
|
||||||
{
|
{
|
||||||
@@ -1637,7 +1642,6 @@ static void async_event(int pipe, time_t now)
|
|||||||
case EVENT_SCRIPT_LOG:
|
case EVENT_SCRIPT_LOG:
|
||||||
my_syslog(MS_SCRIPT | LOG_DEBUG, "%s", msg ? msg : "");
|
my_syslog(MS_SCRIPT | LOG_DEBUG, "%s", msg ? msg : "");
|
||||||
free(msg);
|
free(msg);
|
||||||
msg = NULL;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* necessary for fatal errors in helper */
|
/* necessary for fatal errors in helper */
|
||||||
|
|||||||
+4
-1
@@ -1423,7 +1423,10 @@ static int base32_decode(char *in, unsigned char *out)
|
|||||||
oc |= 1;
|
oc |= 1;
|
||||||
mask = mask >> 1;
|
mask = mask >> 1;
|
||||||
if (((++on) & 7) == 0)
|
if (((++on) & 7) == 0)
|
||||||
|
{
|
||||||
*p++ = oc;
|
*p++ = oc;
|
||||||
|
oc = 0;
|
||||||
|
}
|
||||||
oc = oc << 1;
|
oc = oc << 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1553,7 +1556,7 @@ static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, uns
|
|||||||
{
|
{
|
||||||
unsigned char *salt, *p, *digest;
|
unsigned char *salt, *p, *digest;
|
||||||
int digest_len, i, iterations, salt_len, base32_len, algo = 0;
|
int digest_len, i, iterations, salt_len, base32_len, algo = 0;
|
||||||
struct nettle_hash const *hash;
|
struct nettle_hash const *hash = NULL;
|
||||||
char *closest_encloser, *next_closest, *wildcard;
|
char *closest_encloser, *next_closest, *wildcard;
|
||||||
|
|
||||||
if (nons)
|
if (nons)
|
||||||
|
|||||||
+1
-1
@@ -103,7 +103,7 @@ unsigned char *find_pseudoheader(struct dns_header *header, size_t plen, size_t
|
|||||||
size_t add_pseudoheader(struct dns_header *header, size_t plen, unsigned char *limit,
|
size_t add_pseudoheader(struct dns_header *header, size_t plen, unsigned char *limit,
|
||||||
int optno, unsigned char *opt, size_t optlen, int set_do, int replace)
|
int optno, unsigned char *opt, size_t optlen, int set_do, int replace)
|
||||||
{
|
{
|
||||||
unsigned char *lenp, *datap, *p, *udp_len, *buff = NULL;
|
unsigned char *lenp = NULL, *datap = NULL, *p, *udp_len, *buff = NULL;
|
||||||
int rdlen = 0, is_sign, is_last;
|
int rdlen = 0, is_sign, is_last;
|
||||||
unsigned short flags = set_do ? 0x8000 : 0, rcode = 0;
|
unsigned short flags = set_do ? 0x8000 : 0, rcode = 0;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -5734,7 +5734,7 @@ struct hostsfile *expand_filelist(struct hostsfile *list)
|
|||||||
struct dirent **namelist;
|
struct dirent **namelist;
|
||||||
|
|
||||||
/* find largest used index */
|
/* find largest used index */
|
||||||
for (i = SRC_AH, ah = list; ah; ah = ah->next)
|
for (last = NULL, i = SRC_AH, ah = list; ah; ah = ah->next)
|
||||||
{
|
{
|
||||||
last = ah;
|
last = ah;
|
||||||
|
|
||||||
|
|||||||
+17
-35
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
struct state {
|
struct state {
|
||||||
unsigned char *clid;
|
unsigned char *clid;
|
||||||
int multicast_dest, clid_len, ia_type, interface, hostname_auth, lease_allocate;
|
int clid_len, ia_type, interface, hostname_auth, lease_allocate;
|
||||||
char *client_hostname, *hostname, *domain, *send_domain;
|
char *client_hostname, *hostname, *domain, *send_domain;
|
||||||
struct dhcp_context *context;
|
struct dhcp_context *context;
|
||||||
struct in6_addr *link_address, *fallback, *ll_addr, *ula_addr;
|
struct in6_addr *link_address, *fallback, *ll_addr, *ula_addr;
|
||||||
@@ -34,8 +34,8 @@ struct state {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz,
|
static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz,
|
||||||
struct in6_addr *client_addr, int is_unicast, time_t now);
|
struct in6_addr *client_addr, time_t now);
|
||||||
static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, int is_unicast, time_t now);
|
static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, time_t now);
|
||||||
static void log6_opts(int nest, unsigned int xid, void *start_opts, void *end_opts);
|
static void log6_opts(int nest, unsigned int xid, void *start_opts, void *end_opts);
|
||||||
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);
|
||||||
@@ -81,13 +81,16 @@ unsigned short dhcp6_reply(struct dhcp_context *context, int multicast_dest, int
|
|||||||
|
|
||||||
msg_type = *((unsigned char *)daemon->dhcp_packet.iov_base);
|
msg_type = *((unsigned char *)daemon->dhcp_packet.iov_base);
|
||||||
|
|
||||||
|
/* request from a client must be multicast RFC-9915 section 16 */
|
||||||
|
if (msg_type != DHCP6RELAYFORW && !multicast_dest)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Mark these so we only match each at most once, to avoid tangled linked lists */
|
/* Mark these so we only match each at most once, to avoid tangled linked lists */
|
||||||
for (vendor = daemon->dhcp_vendors; vendor; vendor = vendor->next)
|
for (vendor = daemon->dhcp_vendors; vendor; vendor = vendor->next)
|
||||||
vendor->netid.next = &vendor->netid;
|
vendor->netid.next = &vendor->netid;
|
||||||
|
|
||||||
reset_counter();
|
reset_counter();
|
||||||
state.context = context;
|
state.context = context;
|
||||||
state.multicast_dest = multicast_dest;
|
|
||||||
state.interface = interface;
|
state.interface = interface;
|
||||||
state.iface_name = iface_name;
|
state.iface_name = iface_name;
|
||||||
state.fallback = fallback;
|
state.fallback = fallback;
|
||||||
@@ -97,8 +100,7 @@ unsigned short dhcp6_reply(struct dhcp_context *context, int multicast_dest, int
|
|||||||
state.tags = NULL;
|
state.tags = NULL;
|
||||||
state.link_address = NULL;
|
state.link_address = NULL;
|
||||||
|
|
||||||
if (dhcp6_maybe_relay(&state, daemon->dhcp_packet.iov_base, sz, client_addr,
|
if (dhcp6_maybe_relay(&state, daemon->dhcp_packet.iov_base, sz, client_addr, now))
|
||||||
IN6_IS_ADDR_MULTICAST(client_addr), now))
|
|
||||||
return msg_type == DHCP6RELAYFORW ? DHCPV6_SERVER_PORT : DHCPV6_CLIENT_PORT;
|
return msg_type == DHCP6RELAYFORW ? DHCPV6_SERVER_PORT : DHCPV6_CLIENT_PORT;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -106,7 +108,7 @@ unsigned short dhcp6_reply(struct dhcp_context *context, int multicast_dest, int
|
|||||||
|
|
||||||
/* This cost me blood to write, it will probably cost you blood to understand - srk. */
|
/* This cost me blood to write, it will probably cost you blood to understand - srk. */
|
||||||
static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz,
|
static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz,
|
||||||
struct in6_addr *client_addr, int is_unicast, time_t now)
|
struct in6_addr *client_addr, time_t now)
|
||||||
{
|
{
|
||||||
uint8_t *end = inbuff + sz;
|
uint8_t *end = inbuff + sz;
|
||||||
uint8_t *opts = inbuff + 34;
|
uint8_t *opts = inbuff + 34;
|
||||||
@@ -184,7 +186,7 @@ static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return dhcp6_no_relay(state, msg_type, inbuff, sz, is_unicast, now);
|
return dhcp6_no_relay(state, msg_type, inbuff, sz, now);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* must have at least msg_type+hopcount+link_address+peer_address+minimal size option
|
/* must have at least msg_type+hopcount+link_address+peer_address+minimal size option
|
||||||
@@ -250,9 +252,7 @@ static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t
|
|||||||
/* RFC6221 para 4 */
|
/* RFC6221 para 4 */
|
||||||
if (!IN6_IS_ADDR_UNSPECIFIED(&align))
|
if (!IN6_IS_ADDR_UNSPECIFIED(&align))
|
||||||
state->link_address = &align;
|
state->link_address = &align;
|
||||||
/* zero is_unicast since that is now known to refer to the
|
if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, now))
|
||||||
relayed packet, not the original sent by the client */
|
|
||||||
if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, 0, now))
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -264,7 +264,7 @@ static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, int is_unicast, time_t now)
|
static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, time_t now)
|
||||||
{
|
{
|
||||||
void *opt;
|
void *opt;
|
||||||
int i, o, o1, start_opts, start_msg;
|
int i, o, o1, start_opts, start_msg;
|
||||||
@@ -340,24 +340,19 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|||||||
|
|
||||||
opt = opt6_find(state->packet_options, state->end, OPTION6_SERVER_ID, 1);
|
opt = opt6_find(state->packet_options, state->end, OPTION6_SERVER_ID, 1);
|
||||||
|
|
||||||
if (msg_type == DHCP6SOLICIT || msg_type == DHCP6CONFIRM || msg_type == DHCP6REBIND || msg_type == DHCP6IREQ)
|
if (msg_type == DHCP6SOLICIT || msg_type == DHCP6CONFIRM || msg_type == DHCP6REBIND)
|
||||||
{
|
{
|
||||||
/* Above message types must be multicast 3315 Section 15. */
|
/* SOLICIT, CONFIRM and REBIND messages MUST NOT have a server-id. 3315 para 15.x */
|
||||||
if (!state->multicast_dest)
|
if (opt)
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
/* server-id must match except for SOLICIT, CONFIRM and REBIND messages, which MUST NOT
|
else if (msg_type == DHCP6IREQ)
|
||||||
have a server-id. 3315 para 15.x */
|
|
||||||
if (msg_type == DHCP6IREQ)
|
|
||||||
{
|
{
|
||||||
/* If server-id provided in IREQ, it must match. */
|
/* If server-id provided in IREQ, it must match. */
|
||||||
if (opt && (opt6_len(opt) != daemon->duid_len ||
|
if (opt && (opt6_len(opt) != daemon->duid_len ||
|
||||||
memcmp(opt6_ptr(opt, 0), daemon->duid, daemon->duid_len) != 0))
|
memcmp(opt6_ptr(opt, 0), daemon->duid, daemon->duid_len) != 0))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (opt)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Everything else MUST have a server-id that matches ours. */
|
/* Everything else MUST have a server-id that matches ours. */
|
||||||
@@ -370,18 +365,6 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|||||||
put_opt6(daemon->duid, daemon->duid_len);
|
put_opt6(daemon->duid, daemon->duid_len);
|
||||||
end_opt6(o);
|
end_opt6(o);
|
||||||
|
|
||||||
if (is_unicast &&
|
|
||||||
(msg_type == DHCP6REQUEST || msg_type == DHCP6RENEW || msg_type == DHCP6RELEASE || msg_type == DHCP6DECLINE))
|
|
||||||
|
|
||||||
{
|
|
||||||
outmsgtype = DHCP6REPLY;
|
|
||||||
o1 = new_opt6(OPTION6_STATUS_CODE);
|
|
||||||
put_opt6_short(DHCP6USEMULTI);
|
|
||||||
put_opt6_string("Use multicast");
|
|
||||||
end_opt6(o1);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* match vendor and user class options */
|
/* match vendor and user class options */
|
||||||
for (vendor = daemon->dhcp_vendors; vendor; vendor = vendor->next)
|
for (vendor = daemon->dhcp_vendors; vendor; vendor = vendor->next)
|
||||||
{
|
{
|
||||||
@@ -1304,7 +1287,6 @@ static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbu
|
|||||||
|
|
||||||
log_tags(tagif, state->xid);
|
log_tags(tagif, state->xid);
|
||||||
|
|
||||||
done:
|
|
||||||
/* Fill in the message type. Note that we store the offset,
|
/* Fill in the message type. Note that we store the offset,
|
||||||
not a direct pointer, since the packet memory may have been
|
not a direct pointer, since the packet memory may have been
|
||||||
reallocated. */
|
reallocated. */
|
||||||
|
|||||||
+2
-8
@@ -680,18 +680,12 @@ int expand_buf(struct iovec *iov, size_t size)
|
|||||||
if (size <= (size_t)iov->iov_len)
|
if (size <= (size_t)iov->iov_len)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (!(new = whine_malloc(size)))
|
if (!(new = whine_realloc(iov->iov_base, size)))
|
||||||
{
|
{
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iov->iov_base)
|
|
||||||
{
|
|
||||||
memcpy(new, iov->iov_base, iov->iov_len);
|
|
||||||
free(iov->iov_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
iov->iov_base = new;
|
iov->iov_base = new;
|
||||||
iov->iov_len = size;
|
iov->iov_len = size;
|
||||||
|
|
||||||
@@ -790,7 +784,7 @@ int read_writev(int fd, struct iovec *iov, int iovcnt, int rw)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
done += n;
|
done += n;
|
||||||
while ((size_t)done >= iov[cur].iov_len)
|
while (cur < iovcnt && (size_t)done >= iov[cur].iov_len)
|
||||||
done -= iov[cur++].iov_len;
|
done -= iov[cur++].iov_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user