Avoid infinite loop on EBADFD
[tinc] / src / linux / device.c
index 5717d92..e273bfa 100644 (file)
@@ -101,6 +101,9 @@ static bool setup_device(void) {
                strncpy(ifrname, ifr.ifr_name, IFNAMSIZ);
                free(iface);
                iface = xstrdup(ifrname);
+       } else {
+               logger(DEBUG_ALWAYS, LOG_ERR, "Could not create a tun/tap interface from %s: %s", device, strerror(errno));
+               return false;
        }
 
        logger(DEBUG_ALWAYS, LOG_INFO, "%s is a %s", device, device_info);
@@ -136,6 +139,9 @@ static bool read_packet(vpn_packet_t *packet) {
                        if(inlen <= 0) {
                                logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s",
                                           device_info, device, strerror(errno));
+                               if (errno == EBADFD) { /* File descriptor in bad state */
+                                       event_exit();
+                               }
                                return false;
                        }