chiark / gitweb /
udp: Insist on only one successful default socket setup
[secnet.git] / netlink.c
index ea1221d..75763cf 100644 (file)
--- a/netlink.c
+++ b/netlink.c
@@ -386,7 +386,7 @@ static uint16_t netlink_icmp_reply_len(struct buffer_if *buf)
     /* We include the first 8 bytes of the packet data, provided they exist */
     hlen+=8;
     plen=ntohs(iph->tot_len);
-    return (hlen>plen?plen:hlen);
+    return MIN(hlen,plen);
 }
 
 /* client indicates where the packet we're constructing a response to
@@ -430,7 +430,7 @@ static void netlink_icmp_simple(struct netlink *st,
        len=netlink_icmp_reply_len(buf);
        h=netlink_icmp_tmpl(st,icmpsource,icmpdest,len);
        h->type=type; h->code=code; h->d=info;
-       memcpy(buf_append(&st->icmp,len),buf->start,len);
+       BUF_ADD_BYTES(append,&st->icmp,buf->start,len);
        netlink_icmp_csum(h);
 
        if (!st->ptp) {
@@ -591,7 +591,7 @@ static void netlink_maybe_fragment(struct netlink *st,
        long avail = mtu - hl;
        long remain = endindata - indata;
        long use = avail < remain ? (avail & ~(long)7) : remain;
-       memcpy(buf_append(buf, use), indata, use);
+       BUF_ADD_BYTES(append, buf, indata, use);
        indata += use;
 
        _Bool last_frag = indata >= endindata;
@@ -637,7 +637,6 @@ static void netlink_client_deliver(struct netlink *st,
        d=ipaddr_to_string(dest);
        Message(M_ERR,"%s: dropping %s->%s, client not registered\n",
                st->name,s,d);
-       free(s); free(d);
        BUF_FREE(buf);
        return;
     }
@@ -744,7 +743,6 @@ static void netlink_packet_deliver(struct netlink *st,
            d=ipaddr_to_string(dest);
            Message(M_DEBUG,"%s: don't know where to deliver packet "
                    "(s=%s, d=%s)\n", st->name, s, d);
-           free(s); free(d);
            netlink_icmp_simple(st,sender,buf,ICMP_TYPE_UNREACHABLE,
                                ICMP_CODE_NET_UNREACHABLE, icmp_noinfo);
            BUF_FREE(buf);
@@ -760,7 +758,6 @@ static void netlink_packet_deliver(struct netlink *st,
               with destination network administratively prohibited */
            Message(M_NOTICE,"%s: denied forwarding for packet (s=%s, d=%s)\n",
                    st->name,s,d);
-           free(s); free(d);
                    
            netlink_icmp_simple(st,sender,buf,ICMP_TYPE_UNREACHABLE,
                                ICMP_CODE_NET_PROHIBITED, icmp_noinfo);
@@ -899,7 +896,6 @@ static void netlink_incoming(struct netlink *st, struct netlink_client *sender,
            d=ipaddr_to_string(dest);
            Message(M_WARNING,"%s: packet from tunnel %s with bad "
                    "source address (s=%s,d=%s)\n",st->name,sender->name,s,d);
-           free(s); free(d);
            BUF_FREE(buf);
            return;
        }
@@ -913,7 +909,6 @@ static void netlink_incoming(struct netlink *st, struct netlink_client *sender,
            d=ipaddr_to_string(dest);
            Message(M_WARNING,"%s: outgoing packet with bad source address "
                    "(s=%s,d=%s)\n",st->name,s,d);
-           free(s); free(d);
            BUF_FREE(buf);
            return;
        }
@@ -981,7 +976,6 @@ static void netlink_output_subnets(struct netlink *st, uint32_t loglevel,
     for (i=0; i<snets->entries; i++) {
        net=subnet_to_string(snets->list[i]);
        Message(loglevel,"%s ",net);
-       free(net);
     }
 }
 
@@ -996,7 +990,6 @@ static void netlink_dump_routes(struct netlink *st, bool_t requested)
        net=ipaddr_to_string(st->secnet_address);
        Message(c,"%s: point-to-point (remote end is %s); routes: ",
                st->name, net);
-       free(net);
        netlink_output_subnets(st,c,st->clients->subnets);
        Message(c,"\n");
     } else {
@@ -1017,11 +1010,9 @@ static void netlink_dump_routes(struct netlink *st, bool_t requested)
        net=ipaddr_to_string(st->secnet_address);
        Message(c,"%s/32 -> netlink \"%s\" (use %d)\n",
                net,st->name,st->localcount);
-       free(net);
        for (i=0; i<st->subnets->entries; i++) {
            net=subnet_to_string(st->subnets->list[i]);
            Message(c,"%s ",net);
-           free(net);
        }
        if (i>0)
            Message(c,"-> host (use %d)\n",st->outcount);
@@ -1048,8 +1039,7 @@ static void netlink_phase_hook(void *sst, uint32_t new_phase)
     /* All the networks serviced by the various tunnels should now
      * have been registered.  We build a routing table by sorting the
      * clients by priority.  */
-    st->routes=safe_malloc_ary(sizeof(*st->routes),st->n_clients,
-                              "netlink_phase_hook");
+    NEW_ARY(st->routes,st->n_clients);
     /* Fill the table */
     i=0;
     for (c=st->clients; c; c=c->next) {
@@ -1147,7 +1137,7 @@ static closure_t *netlink_inst_create(struct netlink *st,
        return NULL;
     }
 
-    c=safe_malloc(sizeof(*c),"netlink_inst_create");
+    NEW(c);
     c->cl.description=name;
     c->cl.type=CL_NETLINK;
     c->cl.apply=NULL;
@@ -1316,7 +1306,7 @@ static list_t *null_apply(closure_t *self, struct cloc loc, dict_t *context,
     item_t *item;
     dict_t *dict;
 
-    st=safe_malloc(sizeof(*st),"null_apply");
+    NEW(st);
 
     item=list_elem(args,0);
     if (!item || item->type!=t_dict)