chiark / gitweb /
cleanup: Replace a few calls to malloc/realloc with safe_malloc
[secnet.git] / ipaddr.c
index f8cda00eabbc3f6c5dac170c249a9cb8211572b0..e6d24075806693ce1c347eb4f1f1bb417c039799 100644 (file)
--- a/ipaddr.c
+++ b/ipaddr.c
@@ -35,10 +35,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 +117,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;
     }
@@ -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;