diff --git a/src/Mono.Android/Android.Runtime/JNIEnv.cs b/src/Mono.Android/Android.Runtime/JNIEnv.cs index 8064341be10..74dc2846d4f 100644 --- a/src/Mono.Android/Android.Runtime/JNIEnv.cs +++ b/src/Mono.Android/Android.Runtime/JNIEnv.cs @@ -484,13 +484,20 @@ public static unsafe IntPtr NewString (string? text) return JniEnvironment.Strings.NewString (text).Handle; } - public static unsafe IntPtr NewString (char[]? text, int length) + public static IntPtr NewString (char[]? text, int length) { if (text == null) return IntPtr.Zero; - fixed (char *s = text) - return JniEnvironment.Strings.NewString (s, length).Handle; + if (length < 0 || length > text.Length) + throw new ArgumentOutOfRangeException (nameof (length)); + if (length == 0) + return JniEnvironment.Strings.NewString ("").Handle; + + unsafe { + fixed (char *s = text) + return JniEnvironment.Strings.NewString (s, length).Handle; + } } static void AssertCompatibleArrayTypes (Type srcElementType, IntPtr destArray) diff --git a/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JnienvTest.cs b/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JnienvTest.cs index 99b91a57412..bb72dc37860 100644 --- a/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JnienvTest.cs +++ b/tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JnienvTest.cs @@ -21,6 +21,20 @@ namespace Java.InteropTests [TestFixture] public class JnienvTest { + [Test] + [Category ("JniStringLength")] + public void NewStringValidatesLengthAndSupportsPrefix () + { + var text = new[] { 'f', 'o', 'o' }; + + Assert.Throws (() => JNIEnv.NewString (text, -1)); + Assert.Throws (() => JNIEnv.NewString (text, text.Length + 1)); + Assert.AreEqual (IntPtr.Zero, JNIEnv.NewString ((char[]?) null, -1)); + + IntPtr handle = JNIEnv.NewString (text, 2); + Assert.AreEqual ("fo", JNIEnv.GetString (handle, JniHandleOwnership.TransferLocalRef)); + } + [Test] public void TestMyPaintColor () {