diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-09-03 09:43:48 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-09-06 16:04:25 +0200 |
| commit | 3a7f9631841fbbcac5db3b6877c14d5e40865bb4 (patch) | |
| tree | e2edbb9381fff130c7af549aac43a583efa842c7 | |
| parent | b10d43a7546215b7e6d4f2a07f57398d818c68e0 (diff) | |
| download | mullvadvpn-3a7f9631841fbbcac5db3b6877c14d5e40865bb4.tar.xz mullvadvpn-3a7f9631841fbbcac5db3b6877c14d5e40865bb4.zip | |
Replace GoString with our own function to fix mte issue
Co-authored-by: Joakim Hulthe <joakim@hulthe.net>
| -rw-r--r-- | wireguard-go-rs/libwg/libwg.go | 23 | ||||
| -rw-r--r-- | wireguard-go-rs/libwg/libwg_android.go | 3 | ||||
| -rw-r--r-- | wireguard-go-rs/libwg/libwg_daita.go | 2 | ||||
| -rw-r--r-- | wireguard-go-rs/libwg/libwg_default.go | 2 |
4 files changed, 26 insertions, 4 deletions
diff --git a/wireguard-go-rs/libwg/libwg.go b/wireguard-go-rs/libwg/libwg.go index aaa03ef838..6cfbd0ba55 100644 --- a/wireguard-go-rs/libwg/libwg.go +++ b/wireguard-go-rs/libwg/libwg.go @@ -97,7 +97,7 @@ func wgSetConfig(tunnelHandle int32, cSettings *C.char) C.int32_t { tunnel.Logger.Errorf("cSettings is null\n") return ERROR_INVALID_ARGUMENT } - settings := C.GoString(cSettings) + settings := goStringFixed(cSettings) setError := tunnel.Device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) if setError != nil { @@ -114,3 +114,24 @@ func wgFreePtr(ptr unsafe.Pointer) { } func main() {} + +//Instead of using the normal version of C.GoString we need to use the version that takes +//a length argument (C.GoStringN). That is because the normal C.GoString reads a whole +//page of memory to determine the length of the string. This causes a crash if +//mte is turned on. So instead we determine the length of the c string by reading +//each character until we reach the end of the string. +func goStringFixed(cString *C.char) string { + ptr := unsafe.Pointer(cString) + i := 0 + for { + byte := (*C.char)(unsafe.Pointer(uintptr(ptr) + uintptr(i))) + + if *byte == 0 { + break + } + + i += 1 + } + + return C.GoStringN(cString, C.int(i)) +} diff --git a/wireguard-go-rs/libwg/libwg_android.go b/wireguard-go-rs/libwg/libwg_android.go index 86410721f5..d623b7711d 100644 --- a/wireguard-go-rs/libwg/libwg_android.go +++ b/wireguard-go-rs/libwg/libwg_android.go @@ -37,7 +37,8 @@ func wgTurnOn(cSettings *C.char, fd int, logSink LogSink, logContext LogContext) logger.Errorf("cSettings is null\n") return ERROR_INVALID_ARGUMENT } - settings := C.GoString(cSettings) + + settings := goStringFixed(cSettings) tunDevice, _, err := tun.CreateUnmonitoredTUNFromFD(fd) if err != nil { diff --git a/wireguard-go-rs/libwg/libwg_daita.go b/wireguard-go-rs/libwg/libwg_daita.go index d5f8f132ed..3b1fedda4c 100644 --- a/wireguard-go-rs/libwg/libwg_daita.go +++ b/wireguard-go-rs/libwg/libwg_daita.go @@ -38,7 +38,7 @@ func wgActivateDaita(tunnelHandle C.int32_t, peerPubkey *C.uint8_t, machines *C. return ERROR_UNKNOWN_PEER } - if !peer.EnableDaita(C.GoString((*C.char)(machines)), uint(eventsCapacity), uint(actionsCapacity), maxPaddingBytes, maxBlockingBytes) { + if !peer.EnableDaita(goStringFixed((*C.char)(machines)), uint(eventsCapacity), uint(actionsCapacity), maxPaddingBytes, maxBlockingBytes) { return ERROR_ENABLE_DAITA } diff --git a/wireguard-go-rs/libwg/libwg_default.go b/wireguard-go-rs/libwg/libwg_default.go index 6741de715f..263c231a61 100644 --- a/wireguard-go-rs/libwg/libwg_default.go +++ b/wireguard-go-rs/libwg/libwg_default.go @@ -40,7 +40,7 @@ func wgTurnOn(mtu int, cSettings *C.char, fd int, logSink LogSink, logContext Lo logger.Errorf("cSettings is null\n") return ERROR_INVALID_ARGUMENT } - settings := C.GoString(cSettings) + settings := goStringFixed(cSettings) file := os.NewFile(uintptr(fd), "") tunDevice, err := tun.CreateTUNFromFile(file, mtu) |
