summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-09-03 09:43:48 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-09-06 16:04:25 +0200
commit3a7f9631841fbbcac5db3b6877c14d5e40865bb4 (patch)
treee2edbb9381fff130c7af549aac43a583efa842c7
parentb10d43a7546215b7e6d4f2a07f57398d818c68e0 (diff)
downloadmullvadvpn-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.go23
-rw-r--r--wireguard-go-rs/libwg/libwg_android.go3
-rw-r--r--wireguard-go-rs/libwg/libwg_daita.go2
-rw-r--r--wireguard-go-rs/libwg/libwg_default.go2
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)