From 4a982ab52771dacf610d2c10bc64daf41fc3443b Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sat, 28 Dec 2024 02:53:10 +0100 Subject: Fix marschalling with very long long messages --- .../main/java/de/blinkt/openvpn/core/LogItem.java | 20 +++++++++++-- .../test/java/de/blinkt/openvpn/core/TestLog.kt | 35 ++++++++++++++++++++++ .../de/blinkt/openvpn/core/TestLogFileHandler.java | 5 ++-- 3 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 main/src/test/java/de/blinkt/openvpn/core/TestLog.kt (limited to 'main/src') diff --git a/main/src/main/java/de/blinkt/openvpn/core/LogItem.java b/main/src/main/java/de/blinkt/openvpn/core/LogItem.java index 3ec2e438..9fe1089f 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/LogItem.java +++ b/main/src/main/java/de/blinkt/openvpn/core/LogItem.java @@ -167,7 +167,7 @@ public class LogItem implements Parcelable { throw new IndexOutOfBoundsException("String length " + len + " is bigger than remaining bytes " + bb.remaining()); byte[] utf8bytes = new byte[len]; bb.get(utf8bytes); - mMessage = new String(utf8bytes, "UTF-8"); + mMessage = new String(utf8bytes, StandardCharsets.UTF_8); } int numArgs = bb.getInt(); if (numArgs > 30) { @@ -209,8 +209,22 @@ public class LogItem implements Parcelable { private void marschalString(String str, ByteBuffer bb) throws UnsupportedEncodingException { byte[] utf8bytes = str.getBytes(StandardCharsets.UTF_8); - bb.putInt(utf8bytes.length); - bb.put(utf8bytes); + + byte[] elipse = {'.', '.', '.', '[','t','o','o', ' ', 'l','o','n','g',']'}; + + int maxStringLength = Math.min(8192, bb.remaining()-128); + + if (utf8bytes.length > maxStringLength) + { + bb.putInt(maxStringLength + elipse.length); + bb.put(utf8bytes, 0, maxStringLength); + bb.put(elipse); + } + else + { + bb.putInt(utf8bytes.length); + bb.put(utf8bytes); + } } private String unmarschalString(ByteBuffer bb) throws UnsupportedEncodingException { diff --git a/main/src/test/java/de/blinkt/openvpn/core/TestLog.kt b/main/src/test/java/de/blinkt/openvpn/core/TestLog.kt new file mode 100644 index 00000000..4cce96ad --- /dev/null +++ b/main/src/test/java/de/blinkt/openvpn/core/TestLog.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2012-2024 Arne Schwabe + * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt + */ + +package de.blinkt.openvpn.core + +import org.junit.Assert +import org.junit.Test + +class TestLog { + + @Test + fun testMarschTooLong() + { + /* generate a string that is 16k long */ + var longtsring = ""; + + while (longtsring.length < 16384) + { + longtsring += "very very long string indeed" + } + val li = LogItem(VpnStatus.LogLevel.VERBOSE, longtsring) + + val libytes = li.marschaledBytes; + + Assert.assertTrue(libytes.size > 2000); + Assert.assertTrue(libytes.size < 12000); + + + val liback = LogItem(libytes, libytes.size) + val msgback = liback.getString(null) + Assert.assertTrue(msgback.endsWith("...[too long]")) + } +} \ No newline at end of file diff --git a/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java b/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java index e024bf90..be4621c6 100644 --- a/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java +++ b/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java @@ -7,10 +7,9 @@ package de.blinkt.openvpn.core; import android.annotation.SuppressLint; -import junit.framework.Assert; - import org.junit.Before; import org.junit.Test; +import org.junit.Assert; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -42,7 +41,7 @@ public class TestLogFileHandler { lfh.writeEscapedBytes(testUnescaped); byte[] result = byteArrayOutputStream.toByteArray(); - Assert.assertTrue(Arrays.equals(expectedEscaped, result)); + Assert.assertArrayEquals(expectedEscaped, result); } @Test -- cgit v1.2.3