diff options
| author | David Lönnhager <david.l@mullvad.net> | 2025-01-10 11:45:30 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2025-01-24 17:34:45 +0100 |
| commit | 2fec6bb168e29ea47976b07c188d0cf792d70b77 (patch) | |
| tree | 86d05a4127f18e6f1acb03d882f0c195db12421e | |
| parent | 696c60680a7e4a2c4c6f4778d2d63c135e4469d8 (diff) | |
| download | mullvadvpn-2fec6bb168e29ea47976b07c188d0cf792d70b77.tar.xz mullvadvpn-2fec6bb168e29ea47976b07c188d0cf792d70b77.zip | |
Pass in interface buffer instead of allocating in libwg
| -rw-r--r-- | wireguard-go-rs/libwg/libwg_windows.go | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/wireguard-go-rs/libwg/libwg_windows.go b/wireguard-go-rs/libwg/libwg_windows.go index f4ad7faa6d..fc3d9d18a2 100644 --- a/wireguard-go-rs/libwg/libwg_windows.go +++ b/wireguard-go-rs/libwg/libwg_windows.go @@ -8,6 +8,7 @@ package main // #include <stdlib.h> // #include <stdint.h> +// #include <string.h> import "C" import ( @@ -31,11 +32,8 @@ type LogSink = unsafe.Pointer type LogContext = C.uint64_t //export wgTurnOn -func wgTurnOn(cIfaceName *C.char, cIfaceNameOut **C.char, cLuidOut *C.uint64_t, mtu C.uint16_t, cSettings *C.char, logSink LogSink, logContext LogContext) C.int32_t { +func wgTurnOn(cIfaceName *C.char, cIfaceNameOut *C.char, cIfaceNameOutSize C.size_t, cLuidOut *C.uint64_t, mtu C.uint16_t, cSettings *C.char, logSink LogSink, logContext LogContext) C.int32_t { logger := logging.NewLogger(logSink, logging.LogContext(logContext)) - if cIfaceNameOut != nil { - *cIfaceNameOut = nil - } if cIfaceName == nil { logger.Errorf("cIfaceName is null\n") @@ -60,7 +58,7 @@ func wgTurnOn(cIfaceName *C.char, cIfaceNameOut **C.char, cLuidOut *C.uint64_t, tun.WintunTunnelType = "Mullvad" - wintun, err := tun.CreateTUNWithRequestedGUID(ifaceName, &networkId, mtu) + wintun, err := tun.CreateTUNWithRequestedGUID(ifaceName, &networkId, int(mtu)) if err != nil { logger.Errorf("Failed to create tunnel\n") logger.Errorf("%s\n", err) @@ -106,10 +104,15 @@ func wgTurnOn(cIfaceName *C.char, cIfaceNameOut **C.char, cLuidOut *C.uint64_t, } if cIfaceNameOut != nil { - *cIfaceNameOut = C.CString(actualInterfaceName) + if int(cIfaceNameOutSize) <= len(actualInterfaceName) { + logger.Errorf("Interface name buffer too small\n") + device.Close() + return ERROR_GENERAL_FAILURE + } + C.strcpy(cIfaceNameOut, C.CString(actualInterfaceName)) } if cLuidOut != nil { - *cLuidOut = nativeTun.LUID() + *cLuidOut = C.uint64_t(nativeTun.LUID()) } return C.int32_t(handle) |
