Consistently allocate device and iface variables on the heap.
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 3 Jan 2009 21:06:10 +0000 (22:06 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 3 Jan 2009 21:06:10 +0000 (22:06 +0100)
This fixes a segfault when no Device has been specified and tinc exits, and it
would try to free() a static string. Thanks to Borg for spottin.

src/bsd/device.c
src/cygwin/device.c
src/linux/device.c
src/mingw/device.c
src/raw_socket/device.c
src/solaris/device.c
src/uml_socket/device.c

index 1d4aeee5c57baecd5860f1e429c9e8ac2f60c6ae..01b7071a00687ed1b77b383f1af64ec9d82104a3 100644 (file)
@@ -27,6 +27,7 @@
 #include "net.h"
 #include "route.h"
 #include "utils.h"
+#include "xalloc.h"
 
 #define DEFAULT_DEVICE "/dev/tun0"
 
@@ -37,9 +38,9 @@ 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;
 #if defined(HAVE_OPENBSD) || defined(HAVE_FREEBSD)
@@ -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));
index 3be59ce9d04c868c6b11fac57654235c56347a20..acb0cfaeb5d4c9199be430d48dc372642e5a33bd 100644 (file)
@@ -38,7 +38,7 @@ int device_fd = -1;
 static HANDLE device_handle = INVALID_HANDLE_VALUE;
 char *device = NULL;
 char *iface = NULL;
-char *device_info = NULL;
+static char *device_info = NULL;
 
 static int device_total_in = 0;
 static int device_total_out = 0;
index 302fa6288d946c66008987cdcc8d18b2f40b44b8..87f72ea28440fc442c540961258e5d9c2d314b48 100644 (file)
@@ -34,6 +34,7 @@
 #include "net.h"
 #include "route.h"
 #include "utils.h"
+#include "xalloc.h"
 
 typedef enum device_type_t {
        DEVICE_TYPE_ETHERTAP,
@@ -45,8 +46,8 @@ int device_fd = -1;
 static device_type_t device_type;
 char *device;
 char *iface;
-char ifrname[IFNAMSIZ];
-char *device_info;
+static char ifrname[IFNAMSIZ];
+static char *device_info;
 
 static int device_total_in = 0;
 static int device_total_out = 0;
@@ -58,13 +59,13 @@ 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))
 #ifdef HAVE_LINUX_IF_TUN_H
-               iface = netname;
+               iface = xstrdup(netname);
 #else
-               iface = rindex(device, '/') ? rindex(device, '/') + 1 : device;
+               iface = xstrdup(rindex(device, '/') ? rindex(device, '/') + 1 : device);
 #endif
        device_fd = open(device, O_RDWR | O_NONBLOCK);
 
index 2813a8839cac9a9e45f01282cc4b1629596add27..5494796a11ff289d544650ac3ee545d9a6234503 100644 (file)
@@ -38,7 +38,7 @@ int device_fd = 0;
 static HANDLE device_handle = INVALID_HANDLE_VALUE;
 char *device = NULL;
 char *iface = NULL;
-char *device_info = NULL;
+static char *device_info = NULL;
 
 static int device_total_in = 0;
 static int device_total_out = 0;
@@ -52,7 +52,7 @@ static struct packetbuf {
 
 static int nbufs = 64;
 
-DWORD WINAPI tapreader(void *bla) {
+static DWORD WINAPI tapreader(void *bla) {
        int sock, err, status;
        struct addrinfo *ai;
        struct addrinfo hint = {
index 33857ba11ac5c37bb1ad35ce2568219dbd096e0a..b96f06f4e46a0f61600fa31168f7aa2471d49bd6 100644 (file)
 #include "logger.h"
 #include "utils.h"
 #include "route.h"
+#include "xalloc.h"
 
 int device_fd = -1;
 char *device;
 char *iface;
-char ifrname[IFNAMSIZ];
-char *device_info;
+static char ifrname[IFNAMSIZ];
+static char *device_info;
 
 static int device_total_in = 0;
 static int device_total_out = 0;
@@ -46,12 +47,11 @@ bool setup_device(void)
 
        cp();
 
-       if(!get_config_string
-                 (lookup_config(config_tree, "Interface"), &iface))
-               iface = "eth0";
+       if(!get_config_string(lookup_config(config_tree, "Interface"), &iface))
+               iface = xstrdup("eth0");
 
        if(!get_config_string(lookup_config(config_tree, "Device"), &device))
-               device = iface;
+               device = xstrdup(iface);
 
        device_info = _("raw socket");
 
index 9c2a762a65ccb570f5eff47cb483249340119ef4..04a36a8580d9b64f2d7faf09841586cd9288dae3 100644 (file)
 #include "logger.h"
 #include "net.h"
 #include "utils.h"
+#include "xalloc.h"
 
 #define DEFAULT_DEVICE "/dev/tun"
 
 int device_fd = -1;
 char *device = NULL;
 char *iface = NULL;
-char *device_info = NULL;
+static char *device_info = NULL;
 
 static int device_total_in = 0;
 static int device_total_out = 0;
@@ -51,7 +52,7 @@ bool setup_device(void)
        cp();
 
        if(!get_config_string(lookup_config(config_tree, "Device"), &device))
-               device = DEFAULT_DEVICE;
+               device = xstrdup(DEFAULT_DEVICE);
 
        if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0) {
                logger(LOG_ERR, _("Could not open %s: %s"), device, strerror(errno));
index a7a70fb380a895cb42d72d8ce7e70f933c0d40cd..f81c88f63923840fb22b052081334fbd5f3c2c88 100644 (file)
@@ -36,9 +36,9 @@ static int request_fd = -1;
 static int data_fd = -1;
 static int write_fd = -1;
 static int state = 0;
-char *device;
+char *device = NULL;
 char *iface = NULL;
-char *device_info;
+static char *device_info;
 
 extern char *identname;
 extern bool running;