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.
AC_ARG_ENABLE(vde,
AS_HELP_STRING([--enable-vde], [enable support for Virtual Distributed Ethernet]),
[ AS_IF([test "x$enable_vde" = "xyes"],
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
],
AC_DEFINE(ENABLE_VDE, 1, [Support for VDE])
vde=true
],
-#include <libvdeplug_dyn.h>
#include "conf.h"
#include "device.h"
#include "conf.h"
#include "device.h"
#include "route.h"
#include "xalloc.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) {
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");
}
if(!get_config_string(lookup_config(config_tree, "Device"), &device)) {
xasprintf(&device, RUNSTATEDIR "/vde.ctl");
}
- 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;
}
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);
#ifdef FD_CLOEXEC
fcntl(device_fd, F_SETFD, FD_CLOEXEC);
static void close_device(void) {
if(conn) {
static void close_device(void) {
if(conn) {
- if(plug.dl_handle) {
- libvdeplug_dynclose(plug);
- }
-
free(device);
device = NULL;
free(device);
device = NULL;
}
static bool read_packet(vpn_packet_t *packet) {
}
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));
if(lenin <= 0) {
logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info, device, strerror(errno));
+ 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);
packet->len = lenin;
logger(DEBUG_TRAFFIC, LOG_DEBUG, "Read packet of %d bytes from %s", packet->len, device_info);
}
static bool write_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();
if(errno != EINTR && errno != EAGAIN) {
logger(DEBUG_ALWAYS, LOG_ERR, "Can't write to %s %s: %s", device_info, device, strerror(errno));
event_exit();