X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Flinux%2Fdevice.c;h=4e9591c21c1f8f2a8ae48e5e8eda8cfd16806f54;hp=87f72ea28440fc442c540961258e5d9c2d314b48;hb=6b415a1a7f5bad2fff7b133ef2a2febccb96d6e5;hpb=b069da90d67b49dce041f513a3855b8da3d82f80 diff --git a/src/linux/device.c b/src/linux/device.c index 87f72ea2..4e9591c2 100644 --- a/src/linux/device.c +++ b/src/linux/device.c @@ -1,7 +1,7 @@ /* device.c -- Interaction with Linux ethertap and tun/tap device Copyright (C) 2001-2005 Ivo Timmermans, - 2001-2006 Guus Sliepen + 2001-2009 Guus Sliepen 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 @@ -44,8 +44,8 @@ typedef enum device_type_t { int device_fd = -1; static device_type_t device_type; -char *device; -char *iface; +char *device = NULL; +char *iface = NULL; static char ifrname[IFNAMSIZ]; static char *device_info; @@ -63,7 +63,8 @@ bool setup_device(void) if(!get_config_string(lookup_config(config_tree, "Interface"), &iface)) #ifdef HAVE_LINUX_IF_TUN_H - iface = xstrdup(netname); + if (netname != NULL) + iface = xstrdup(netname); #else iface = xstrdup(rindex(device, '/') ? rindex(device, '/') + 1 : device); #endif @@ -93,11 +94,13 @@ bool setup_device(void) if(!ioctl(device_fd, TUNSETIFF, &ifr)) { strncpy(ifrname, ifr.ifr_name, IFNAMSIZ); - iface = ifrname; + if(iface) free(iface); + iface = xstrdup(ifrname); } else if(!ioctl(device_fd, (('T' << 8) | 202), &ifr)) { logger(LOG_WARNING, _("Old ioctl() request was needed for %s"), device); strncpy(ifrname, ifr.ifr_name, IFNAMSIZ); - iface = ifrname; + if(iface) free(iface); + iface = xstrdup(ifrname); } else #endif { @@ -105,7 +108,9 @@ bool setup_device(void) overwrite_mac = true; device_info = _("Linux ethertap device"); device_type = DEVICE_TYPE_ETHERTAP; - iface = rindex(device, '/') ? rindex(device, '/') + 1 : device; + if(iface) + free(iface); + iface = xstrdup(rindex(device, '/') ? rindex(device, '/') + 1 : device); } logger(LOG_INFO, _("%s is a %s"), device, device_info); @@ -118,6 +123,9 @@ void close_device(void) cp(); close(device_fd); + + free(device); + free(iface); } bool read_packet(vpn_packet_t *packet)