From 3a610feb96c7eb38a0806de08922edbaf4db9b1e Mon Sep 17 00:00:00 2001 From: Mark Puha Date: Tue, 22 Jul 2025 06:25:05 +0200 Subject: [PATCH] fix: awg memory management --- src/containers.h | 15 +++++++++++++++ src/ipc-freebsd.h | 8 ++++---- src/ipc-linux.h | 8 ++++---- src/ipc-openbsd.h | 26 ++++++++++++++++++++++++++ src/ipc-windows.h | 22 ++++++++++++++++++---- 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/containers.h b/src/containers.h index fa722bc..b72e0f0 100644 --- a/src/containers.h +++ b/src/containers.h @@ -150,6 +150,21 @@ static inline void free_wgdevice(struct wgdevice *dev) free(allowedip); free(peer); } + + + free(dev->init_packet_magic_header); + free(dev->response_packet_magic_header); + free(dev->underload_packet_magic_header); + free(dev->transport_packet_magic_header); + free(dev->i1); + free(dev->i2); + free(dev->i3); + free(dev->i4); + free(dev->i5); + free(dev->j1); + free(dev->j2); + free(dev->j3); + free(dev); } diff --git a/src/ipc-freebsd.h b/src/ipc-freebsd.h index 170d74c..52f9f34 100644 --- a/src/ipc-freebsd.h +++ b/src/ipc-freebsd.h @@ -140,7 +140,7 @@ static int kernel_get_device(struct wgdevice **device, const char *ifname) dev->flags |= WGDEVICE_HAS_S4; } } - if (nvlist_exists_number(nvl_device, "h1")) { + if (nvlist_exists_binary(nvl_device, "h1")) { binary = nvlist_get_binary(nvl_device, "h1", &size); if (binary && size < MAX_AWG_STRING_LEN) { @@ -148,7 +148,7 @@ static int kernel_get_device(struct wgdevice **device, const char *ifname) dev->flags |= WGDEVICE_HAS_H1; } } - if (nvlist_exists_number(nvl_device, "h2")) { + if (nvlist_exists_binary(nvl_device, "h2")) { binary = nvlist_get_binary(nvl_device, "h2", &size); if (binary && size < MAX_AWG_STRING_LEN) { @@ -156,7 +156,7 @@ static int kernel_get_device(struct wgdevice **device, const char *ifname) dev->flags |= WGDEVICE_HAS_H2; } } - if (nvlist_exists_number(nvl_device, "h3")) { + if (nvlist_exists_binary(nvl_device, "h3")) { binary = nvlist_get_binary(nvl_device, "h3", &size); if (binary && size < MAX_AWG_STRING_LEN) { @@ -164,7 +164,7 @@ static int kernel_get_device(struct wgdevice **device, const char *ifname) dev->flags |= WGDEVICE_HAS_H3; } } - if (nvlist_exists_number(nvl_device, "h4")) { + if (nvlist_exists_binary(nvl_device, "h4")) { binary = nvlist_get_binary(nvl_device, "h4", &size); if (binary && size < MAX_AWG_STRING_LEN) { diff --git a/src/ipc-linux.h b/src/ipc-linux.h index 77542c1..8c2e682 100644 --- a/src/ipc-linux.h +++ b/src/ipc-linux.h @@ -548,25 +548,25 @@ static int parse_device(const struct nlattr *attr, void *data) } break; case WGDEVICE_A_H1: - if (!mnl_attr_validate(attr, MNL_TYPE_U32)) { + if (!mnl_attr_validate(attr, MNL_TYPE_STRING)) { device->init_packet_magic_header = strdup(mnl_attr_get_str(attr)); device->flags |= WGDEVICE_HAS_H1; } break; case WGDEVICE_A_H2: - if (!mnl_attr_validate(attr, MNL_TYPE_U32)) { + if (!mnl_attr_validate(attr, MNL_TYPE_STRING)) { device->response_packet_magic_header = strdup(mnl_attr_get_str(attr)); device->flags |= WGDEVICE_HAS_H2; } break; case WGDEVICE_A_H3: - if (!mnl_attr_validate(attr, MNL_TYPE_U32)) { + if (!mnl_attr_validate(attr, MNL_TYPE_STRING)) { device->underload_packet_magic_header = strdup(mnl_attr_get_str(attr)); device->flags |= WGDEVICE_HAS_H3; } break; case WGDEVICE_A_H4: - if (!mnl_attr_validate(attr, MNL_TYPE_U32)) { + if (!mnl_attr_validate(attr, MNL_TYPE_STRING)) { device->transport_packet_magic_header = strdup(mnl_attr_get_str(attr)); device->flags |= WGDEVICE_HAS_H4; } diff --git a/src/ipc-openbsd.h b/src/ipc-openbsd.h index 383de9b..231ff77 100644 --- a/src/ipc-openbsd.h +++ b/src/ipc-openbsd.h @@ -495,6 +495,32 @@ static int kernel_set_device(struct wgdevice *dev) out: ret = -errno; + if (wgdata.wgd_interface) { + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_H1) + free(wg_iface->i_init_packet_magic_header); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_H2) + free(wg_iface->i_response_packet_magic_header); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_H3) + free(wg_iface->i_underload_packet_magic_header); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_H4) + free(wg_iface->i_transport_packet_magic_header); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_I1) + free(wg_iface->i_i1); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_I2) + free(wg_iface->i_i2); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_I3) + free(wg_iface->i_i3); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_I4) + free(wg_iface->i_i4); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_I5) + free(wg_iface->i_i5); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_J1) + free(wg_iface->i_j1); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_J2) + free(wg_iface->i_j2); + if (wg_iface->i_flags & WG_INTERFACE_DEVICE_HAS_J3) + free(wg_iface->i_j3); + } free(wgdata.wgd_interface); return ret; } diff --git a/src/ipc-windows.h b/src/ipc-windows.h index cddadd4..c4da037 100644 --- a/src/ipc-windows.h +++ b/src/ipc-windows.h @@ -525,28 +525,28 @@ static int kernel_set_device(struct wgdevice *dev) if (dev->flags & WGDEVICE_HAS_H1) { const size_t init_size = strlen(dev->init_packet_magic_header) + 1; - wg_iface->InitPacketMagicHeader = (char*)init_size; + wg_iface->InitPacketMagicHeader = (UCHAR*)malloc(init_size); memcpy(wg_iface->InitPacketMagicHeader, dev->init_packet_magic_header, init_size); wg_iface->Flags |= WG_IOCTL_INTERFACE_H1; } if (dev->flags & WGDEVICE_HAS_H2) { const size_t response_size = strlen(dev->response_packet_magic_header) + 1; - wg_iface->ResponsePacketMagicHeader = (char*)response_size; + wg_iface->ResponsePacketMagicHeader = (UCHAR*)malloc(response_size); memcpy(wg_iface->ResponsePacketMagicHeader, dev->response_packet_magic_header, response_size); wg_iface->Flags |= WG_IOCTL_INTERFACE_H2; } if (dev->flags & WGDEVICE_HAS_H3) { const size_t underload_size = strlen(dev->underload_packet_magic_header) + 1; - wg_iface->UnderloadPacketMagicHeader = (char*)underload_size; + wg_iface->UnderloadPacketMagicHeader = (UCHAR*)malloc(underload_size); memcpy(wg_iface->UnderloadPacketMagicHeader, dev->underload_packet_magic_header, underload_size); wg_iface->Flags |= WG_IOCTL_INTERFACE_H3; } if (dev->flags & WGDEVICE_HAS_H4) { const size_t transport_size = strlen(dev->transport_packet_magic_header) + 1; - wg_iface->TransportPacketMagicHeader = (char*)transport_size; + wg_iface->TransportPacketMagicHeader = (UCHAR*)malloc(transport_size); memcpy(wg_iface->TransportPacketMagicHeader, dev->transport_packet_magic_header, transport_size); wg_iface->Flags |= WG_IOCTL_INTERFACE_H4; } @@ -672,6 +672,20 @@ static int kernel_set_device(struct wgdevice *dev) out: ret = -errno; + if (wg_iface) { + free(wg_iface->InitPacketMagicHeader); + free(wg_iface->ResponsePacketMagicHeader); + free(wg_iface->UnderloadPacketMagicHeader); + free(wg_iface->TransportPacketMagicHeader); + free(wg_iface->I1); + free(wg_iface->I2); + free(wg_iface->I3); + free(wg_iface->I4); + free(wg_iface->I5); + free(wg_iface->J1); + free(wg_iface->J2); + free(wg_iface->J3); + } free(wg_iface); CloseHandle(handle); return ret;