From: Guus Sliepen <guus@tinc-vpn.org>
Date: Wed, 11 Oct 2017 18:02:22 +0000 (+0200)
Subject: Handle tun/tap device returning EPERM or EBUSY.
X-Git-Tag: release-1.0.33~10
X-Git-Url: http://git.tinc-vpn.org/git/browse?a=commitdiff_plain;h=a7e906d2d6b15dd9e6c471a720bbbc39bd9da9a7;p=tinc

Handle tun/tap device returning EPERM or EBUSY.

Often when tun/tap is used any errors during setup will be confuse tinc
and it will then assume it is an Ethertap device. Try to avoid this by
checking errno after a failed TUNSETIFF; if it's EPERM or EBUSY then
we can be sure it was not an Ethertap device, and we should report an
error instead.

Closes #157 on GitHub.
---

diff --git a/src/linux/device.c b/src/linux/device.c
index f75f4bdb..990de6a8 100644
--- a/src/linux/device.c
+++ b/src/linux/device.c
@@ -125,6 +125,9 @@ static bool setup_device(void) {
 		ifrname[IFNAMSIZ - 1] = 0;
 		free(iface);
 		iface = xstrdup(ifrname);
+	} else if(errno == EPERM || errno == EBUSY) {
+		logger(LOG_ERR, "Error while trying to configure %s: %s", device, strerror(errno));
+		return false;
 	} 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);