mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 18:28:25 +00:00
Introduce whine_realloc
Move few patters with whine_malloc, if (successful) copy+free, to a new whine_realloc. It should do the same thing, but with a help from OS it can avoid unnecessary copy and free if allocation of more data after current data is possible. Added few setting remanining space to 0, because realloc does not use calloc like whine_malloc does. There is no advantage of zeroing what we will immediately overwrite. Zero only remaining space.
This commit is contained in:
committed by
Simon Kelley
parent
ba4c7d906b
commit
0666ae3d27
@@ -1676,10 +1676,8 @@ int cache_make_stat(struct txt_record *t)
|
|||||||
{
|
{
|
||||||
/* expand buffer if necessary */
|
/* expand buffer if necessary */
|
||||||
newlen = bytes_needed + 1 + bufflen - bytes_avail;
|
newlen = bytes_needed + 1 + bufflen - bytes_avail;
|
||||||
if (!(new = whine_malloc(newlen)))
|
if (!(new = whine_realloc(buff, newlen)))
|
||||||
return 0;
|
return 0;
|
||||||
memcpy(new, buff, bufflen);
|
|
||||||
free(buff);
|
|
||||||
p = new + (p - buff);
|
p = new + (p - buff);
|
||||||
lenp = p - 1;
|
lenp = p - 1;
|
||||||
buff = new;
|
buff = new;
|
||||||
|
|||||||
@@ -1396,6 +1396,7 @@ void *safe_malloc(size_t size);
|
|||||||
void safe_strncpy(char *dest, const char *src, size_t size);
|
void safe_strncpy(char *dest, const char *src, size_t size);
|
||||||
void safe_pipe(int *fd, int read_noblock);
|
void safe_pipe(int *fd, int read_noblock);
|
||||||
void *whine_malloc(size_t size);
|
void *whine_malloc(size_t size);
|
||||||
|
void *whine_realloc(void *ptr, size_t size);
|
||||||
int sa_len(union mysockaddr *addr);
|
int sa_len(union mysockaddr *addr);
|
||||||
int sockaddr_isequal(const union mysockaddr *s1, const union mysockaddr *s2);
|
int sockaddr_isequal(const union mysockaddr *s1, const union mysockaddr *s2);
|
||||||
int hostname_order(const char *a, const char *b);
|
int hostname_order(const char *a, const char *b);
|
||||||
|
|||||||
@@ -1180,17 +1180,11 @@ void lease_add_extradata(struct dhcp_lease *lease, unsigned char *data, unsigned
|
|||||||
if ((lease->extradata_size - lease->extradata_len) < (len + 1))
|
if ((lease->extradata_size - lease->extradata_len) < (len + 1))
|
||||||
{
|
{
|
||||||
size_t newsz = lease->extradata_len + len + 100;
|
size_t newsz = lease->extradata_len + len + 100;
|
||||||
unsigned char *new = whine_malloc(newsz);
|
unsigned char *new = whine_realloc(lease->extradata, newsz);
|
||||||
|
|
||||||
if (!new)
|
if (!new)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (lease->extradata)
|
|
||||||
{
|
|
||||||
memcpy(new, lease->extradata, lease->extradata_len);
|
|
||||||
free(lease->extradata);
|
|
||||||
}
|
|
||||||
|
|
||||||
lease->extradata = new;
|
lease->extradata = new;
|
||||||
lease->extradata_size = newsz;
|
lease->extradata_size = newsz;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,14 +105,15 @@ void poll_listen(int fd, short event)
|
|||||||
|
|
||||||
arrsize = (arrsize == 0) ? 64 : arrsize * 2;
|
arrsize = (arrsize == 0) ? 64 : arrsize * 2;
|
||||||
|
|
||||||
if (!(new = whine_malloc(arrsize * sizeof(struct pollfd))))
|
if (!(new = whine_realloc(pollfds, arrsize * sizeof(struct pollfd))))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pollfds)
|
if (pollfds)
|
||||||
{
|
{
|
||||||
memcpy(new, pollfds, i * sizeof(struct pollfd));
|
memmove(&new[i+1], &new[i], (nfds - i) * sizeof(struct pollfd));
|
||||||
memcpy(&new[i+1], &pollfds[i], (nfds - i) * sizeof(struct pollfd));
|
/* clear remaining space with zeroes. */
|
||||||
free(pollfds);
|
if (nfds+1 < arrsize)
|
||||||
|
memset(new+nfds+1, 0, arrsize-nfds-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pollfds = new;
|
pollfds = new;
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ static int check_rrs(unsigned char *p, struct dns_header *header, size_t plen, i
|
|||||||
/* mode may be remove EDNS0 or DNSSEC RRs or remove A or AAAA from answer section. */
|
/* mode may be remove EDNS0 or DNSSEC RRs or remove A or AAAA from answer section. */
|
||||||
size_t rrfilter(struct dns_header *header, size_t plen, int mode)
|
size_t rrfilter(struct dns_header *header, size_t plen, int mode)
|
||||||
{
|
{
|
||||||
static unsigned char **rrs;
|
static unsigned char **rrs = NULL;
|
||||||
static int rr_sz = 0;
|
static int rr_sz = 0;
|
||||||
|
|
||||||
unsigned char *p = (unsigned char *)(header+1);
|
unsigned char *p = (unsigned char *)(header+1);
|
||||||
@@ -339,15 +339,11 @@ int expand_workspace(unsigned char ***wkspc, int *szp, int new)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
new += 5;
|
new += 5;
|
||||||
|
|
||||||
if (!(p = whine_malloc(new * sizeof(unsigned char *))))
|
if (!(p = whine_realloc(*wkspc, new * sizeof(unsigned char *))))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (old != 0 && *wkspc)
|
memset(p+old, 0, new-old);
|
||||||
{
|
|
||||||
memcpy(p, *wkspc, old * sizeof(unsigned char *));
|
|
||||||
free(*wkspc);
|
|
||||||
}
|
|
||||||
|
|
||||||
*wkspc = p;
|
*wkspc = p;
|
||||||
*szp = new;
|
*szp = new;
|
||||||
|
|||||||
10
src/util.c
10
src/util.c
@@ -336,6 +336,16 @@ void *whine_malloc(size_t size)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *whine_realloc(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
void *ret = realloc(ptr, size);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
my_syslog(LOG_ERR, _("failed to reallocate %d bytes"), (int) size);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int sockaddr_isequal(const union mysockaddr *s1, const union mysockaddr *s2)
|
int sockaddr_isequal(const union mysockaddr *s1, const union mysockaddr *s2)
|
||||||
{
|
{
|
||||||
if (s1->sa.sa_family == s2->sa.sa_family)
|
if (s1->sa.sa_family == s2->sa.sa_family)
|
||||||
|
|||||||
Reference in New Issue
Block a user