Use libvdeplug.h instead of libvdeplug_dyn.h
authorFufu Fang <fangfufu2003@gmail.com>
Sun, 8 Aug 2021 22:39:03 +0000 (23:39 +0100)
committerFufu Fang <fangfufu2003@gmail.com>
Mon, 9 Aug 2021 10:36:34 +0000 (11:36 +0100)
Fix https://github.com/gsliepen/tinc/issues/300

The libvdeplug.h from Debian Unstable is almost identical to the
one from Debian Buster. My making this change, the task of linking
the libvdeplug library is passed to the system dynamic linker at
tincd start time, instead of doing it manually with
libvdeplug_dynopen when vde functionality is actually needed.

This fixes the compilation issue in Ubuntu 21.04 and Debian
Unstable.

configure.ac
src/vde_device.c

index 944e63a..db7d1aa 100644 (file)
@@ -90,8 +90,12 @@ AC_ARG_ENABLE(uml,
 AC_ARG_ENABLE(vde,
   AS_HELP_STRING([--enable-vde], [enable support for Virtual Distributed Ethernet]),
   [ AS_IF([test "x$enable_vde" = "xyes"],
-      [ AC_CHECK_HEADERS(libvdeplug_dyn.h, [], [AC_MSG_ERROR([VDE plug header files not found.]); break])
-        AC_CHECK_LIB(dl, dlopen, [LIBS="$LIBS -ldl"], [AC_MSG_ERROR([VDE plug depends on libdl.]); break])
+      [ AC_CHECK_HEADERS(libvdeplug.h,
+        [AC_CHECK_LIB(vdeplug, vde_close,
+                      [LIBS="$LIBS -lvdeplug"],
+                      [AC_MSG_ERROR("VDE plug library files not found.")]
+        )],
+        [AC_MSG_ERROR([VDE plug header files not found.]); break])
         AC_DEFINE(ENABLE_VDE, 1, [Support for VDE])
         vde=true
       ],
index b5f0785..f30c3e3 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "system.h"
 
-#include <libvdeplug_dyn.h>
+#include <libvdeplug.h>
 
 #include "conf.h"
 #include "device.h"
 #include "route.h"
 #include "xalloc.h"
 
-static struct vdepluglib plug;
 static struct vdeconn *conn = NULL;
 static int port = 0;
 static char *group = NULL;
 static const char *device_info = "VDE socket";
 
 static bool setup_device(void) {
-       libvdeplug_dynopen(plug);
-
-       if(!plug.dl_handle) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Could not open libvdeplug library!");
-               return false;
-       }
-
        if(!get_config_string(lookup_config(config_tree, "Device"), &device)) {
                xasprintf(&device, RUNSTATEDIR "/vde.ctl");
        }
@@ -59,14 +51,14 @@ static bool setup_device(void) {
                .mode = 0700,
        };
 
-       conn = plug.vde_open(device, identname, &args);
+       conn = vde_open(device, identname, &args);
 
        if(!conn) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Could not open VDE socket %s", device);
                return false;
        }
 
-       device_fd = plug.vde_datafd(conn);
+       device_fd = vde_datafd(conn);
 
 #ifdef FD_CLOEXEC
        fcntl(device_fd, F_SETFD, FD_CLOEXEC);
@@ -83,14 +75,10 @@ static bool setup_device(void) {
 
 static void close_device(void) {
        if(conn) {
-               plug.vde_close(conn);
+               vde_close(conn);
                conn = NULL;
        }
 
-       if(plug.dl_handle) {
-               libvdeplug_dynclose(plug);
-       }
-
        free(device);
        device = NULL;
 
@@ -101,7 +89,7 @@ static void close_device(void) {
 }
 
 static bool read_packet(vpn_packet_t *packet) {
-       ssize_t lenin = (ssize_t) plug.vde_recv(conn, DATA(packet), MTU, 0);
+       ssize_t lenin = vde_recv(conn, DATA(packet), MTU, 0);
 
        if(lenin <= 0) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info, device, strerror(errno));
@@ -109,6 +97,18 @@ static bool read_packet(vpn_packet_t *packet) {
                return false;
        }
 
+       if(lenin == 1) {
+               logger(DEBUG_TRAFFIC, LOG_DEBUG,
+                      "Dropped a packet received from %s - the sender was not allowed to send that packet.", device_info);
+               return false;
+       }
+
+       if(lenin < 14) {
+               logger(DEBUG_TRAFFIC, LOG_DEBUG,
+                      "Received an invalid packet from %s - packet shorter than an ethernet header).", device_info);
+               return false;
+       }
+
        packet->len = lenin;
 
        logger(DEBUG_TRAFFIC, LOG_DEBUG, "Read packet of %d bytes from %s", packet->len, device_info);
@@ -117,7 +117,7 @@ static bool read_packet(vpn_packet_t *packet) {
 }
 
 static bool write_packet(vpn_packet_t *packet) {
-       if((ssize_t)plug.vde_send(conn, DATA(packet), packet->len, 0) < 0) {
+       if(vde_send(conn, DATA(packet), packet->len, 0) < 0) {
                if(errno != EINTR && errno != EAGAIN) {
                        logger(DEBUG_ALWAYS, LOG_ERR, "Can't write to %s %s: %s", device_info, device, strerror(errno));
                        event_exit();