X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=secnet.git;a=blobdiff_plain;f=ipaddr.c;h=899581f0e0a11bae619c03b8ad1d01fb32b010af;hp=f8cda00eabbc3f6c5dac170c249a9cb8211572b0;hb=94a1d5fce6a68fce8216d4b45ef6148d353c2c3a;hpb=1caa23ff879cec7f8f36b32a987f0610291ef177 diff --git a/ipaddr.c b/ipaddr.c index f8cda00..899581f 100644 --- a/ipaddr.c +++ b/ipaddr.c @@ -7,6 +7,7 @@ #include #include #include "ipaddr.h" +#include "util.h" #define DEFAULT_ALLOC 2 #define EXTEND_ALLOC_BY 4 @@ -35,10 +36,7 @@ static void subnet_list_set_len(struct subnet_list *a, int32_t l) if (l>a->alloc) { assert(a->alloc < (int)(INT_MAX/sizeof(*nd))-EXTEND_ALLOC_BY); na=a->alloc+EXTEND_ALLOC_BY; - nd=realloc(a->list,sizeof(*nd)*na); - if (!nd) { - fatal_perror("subnet_list_set_len: realloc"); - } + nd=safe_realloc_ary(a->list,sizeof(*nd),na,"subnet_list_set_len"); a->alloc=na; a->list=nd; } @@ -120,10 +118,7 @@ static void ipset_set_len(struct ipset *a, int32_t l) if (l>a->a) { assert(a->a < INT_MAX-EXTEND_ALLOC_BY); na=a->a+EXTEND_ALLOC_BY; - nd=realloc(a->d,sizeof(*nd)*na); - if (!nd) { - fatal_perror("ipset_set_len: realloc"); - } + nd=safe_realloc_ary(a->d,sizeof(*nd),na,"ipset_set_len"); a->a=na; a->d=nd; } @@ -136,7 +131,6 @@ static void ipset_append_range(struct ipset *a, struct iprange r) a->d[a->l-1]=r; } -#define max(a,b) (a>b?a:b) struct ipset *ipset_union(struct ipset *a, struct ipset *b) { struct ipset *c; @@ -161,7 +155,7 @@ struct ipset *ipset_union(struct ipset *a, struct ipset *b) ipset_append_range(c,r); else if (r.a <= c->d[c->l-1].b+1) /* Extends (or is consumed by) the last range */ - c->d[c->l-1].b=max(c->d[c->l-1].b, r.b); + c->d[c->l-1].b=MAX(c->d[c->l-1].b, r.b); else ipset_append_range(c,r); } @@ -323,13 +317,27 @@ struct subnet_list *ipset_to_subnet_list(struct ipset *is) return r; } +#define IPADDR_NBUFS_SHIFT 4 +#define IPADDR_NBUFS (1 << IPADDR_NBUFS_SHIFT) +#define IPADDR_BUFLEN 20 + +static char *ipaddr_getbuf(void) +{ + static int ipaddr_bufnum; + static char ipaddr_bufs[IPADDR_NBUFS][IPADDR_BUFLEN]; + + ipaddr_bufnum++; + ipaddr_bufnum &= IPADDR_NBUFS-1; + return ipaddr_bufs[ipaddr_bufnum]; +} + /* The string buffer must be at least 16 bytes long */ string_t ipaddr_to_string(uint32_t addr) { uint8_t a,b,c,d; string_t s; - s=safe_malloc(16,"ipaddr_to_string"); + s=ipaddr_getbuf(); a=addr>>24; b=addr>>16; c=addr>>8; @@ -344,7 +352,7 @@ string_t subnet_to_string(struct subnet sn) uint8_t a,b,c,d; string_t s; - s=safe_malloc(19,"subnet_to_string"); + s=ipaddr_getbuf(); a=addr>>24; b=addr>>16; c=addr>>8; @@ -404,7 +412,7 @@ static struct subnet string_item_to_subnet(item_t *i, cstring_t desc, return s; } -uint32_t string_item_to_ipaddr(item_t *i, cstring_t desc) +uint32_t string_item_to_ipaddr(const item_t *i, cstring_t desc) { uint32_t a, b, c, d; int match;