chiark / gitweb /
Provide text2iaddr.
[secnet.git] / tun.c
diff --git a/tun.c b/tun.c
index dcfd62392d825994665a787a88f3afe588230d3c..9ef3a9d627c161b96c50290b2985dcf7d307d176 100644 (file)
--- a/tun.c
+++ b/tun.c
@@ -116,7 +116,7 @@ static void tun_afterpoll(void *sst, struct pollfd *fds, int nfds)
     if (fds[0].revents&POLLIN) {
        BUF_ALLOC(st->buff,"tun_afterpoll");
        buffer_init(st->buff,calculate_max_start_pad());
-       l=read(st->fd,st->buff->start,st->buff->len-calculate_max_start_pad());
+       l=read(st->fd, st->buff->start, buf_remaining_space(st->buff));
        if (l<0) {
            fatal_perror("tun_afterpoll: read()");
        }
@@ -240,10 +240,8 @@ static bool_t tun_set_route(void *sst, struct netlink_client *routes)
            fatal("tun_set_route: unsupported route command type");
            break;
        }
-       free(network); free(mask);
     }
-    free(secnetaddr);
-    if (st->route_type==TUN_CONFIG_IOCTL) {
+    if (fd >= 0) {
        close(fd);
     }
     routes->kup=up;
@@ -342,6 +340,8 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
        st->interface_name=safe_malloc(10,"tun_apply");
        sprintf(st->interface_name,"tun%d",ppa);
        st->fd=tun_fd;
+       setcloexec(if_ifd);
+       setcloexec(ip_ifd);
 #else
        fatal("tun_phase_hook: TUN_FLAVOUR_STREAMS unexpected");
 #endif /* HAVE_TUN_STREAMS */
@@ -352,6 +352,8 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
        to set the TUN device's address, and route to add routes to all
        our networks. */
 
+    setcloexec(st->fd);
+
     hostaddr=ipaddr_to_string(st->nl.local_address);
     secnetaddr=ipaddr_to_string(st->nl.secnet_address);
     snprintf(mtu,sizeof(mtu),"%d",st->nl.mtu);