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 1d4aeee..01b7071 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 3be59ce..acb0cfa 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 302fa62..87f72ea 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 2813a88..5494796 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 33857ba..b96f06f 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 9c2a762..04a36a8 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 a7a70fb..f81c88f 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;