Consistently allocate device and iface variables on the heap.
[tinc] / src / bsd / device.c
index 803ca5c..01b7071 100644 (file)
@@ -1,7 +1,7 @@
 /*
     device.c -- Interaction BSD tun/tap device
-    Copyright (C) 2001-2005 Ivo Timmermans <ivo@tinc-vpn.org>,
-                  2001-2005 Guus Sliepen <guus@tinc-vpn.org>
+    Copyright (C) 2001-2005 Ivo Timmermans,
+                  2001-2008 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -27,6 +27,7 @@
 #include "net.h"
 #include "route.h"
 #include "utils.h"
+#include "xalloc.h"
 
 #define DEFAULT_DEVICE "/dev/tun0"
 
@@ -37,12 +38,12 @@ typedef enum device_type {
 } device_type_t;
 
 int device_fd = -1;
-char *device;
-char *iface;
-char *device_info;
+char *device = NULL;
+char *iface = NULL;
+static char *device_info = NULL;
 static int device_total_in = 0;
 static int device_total_out = 0;
-#ifdef HAVE_OPENBSD
+#if defined(HAVE_OPENBSD) || defined(HAVE_FREEBSD)
 static device_type_t device_type = DEVICE_TYPE_TUNIFHEAD;
 #else
 static device_type_t device_type = DEVICE_TYPE_TUN;
@@ -54,10 +55,10 @@ bool setup_device(void) {
        cp();
 
        if(!get_config_string(lookup_config(config_tree, "Device"), &device))
-               device = DEFAULT_DEVICE;
+               device = xstrdup(DEFAULT_DEVICE);
 
        if(!get_config_string(lookup_config(config_tree, "Interface"), &iface))
-               iface = rindex(device, '/') ? rindex(device, '/') + 1 : device;
+               iface = xstrdup(rindex(device, '/') ? rindex(device, '/') + 1 : device);
 
        if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0) {
                logger(LOG_ERR, _("Could not open %s: %s"), device, strerror(errno));
@@ -78,7 +79,7 @@ bool setup_device(void) {
                        return false;
                }
        } else {
-               if(strstr(device, "tap"))
+               if(strstr(device, "tap") || routing_mode != RMODE_ROUTER)
                        device_type = DEVICE_TYPE_TAP;
        }
 
@@ -245,7 +246,7 @@ bool write_packet(vpn_packet_t *packet)
 
                case DEVICE_TYPE_TUNIFHEAD: {
                        u_int32_t type;
-                       struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, MTU - 14}};
+                       struct iovec vector[2] = {{&type, sizeof(type)}, {packet->data + 14, packet->len - 14}};
                        int af;
                        
                        af = (packet->data[12] << 8) + packet->data[13];