From 7af46a6b424cadfe298958d774da0f21db58ecd3 Mon Sep 17 00:00:00 2001
From: Justin Lu <jlu@openjdk.org>
Date: Thu, 24 Oct 2024 16:17:43 +0000
Subject: [PATCH] 8340554: Improve MessageFormat readObject checks

Reviewed-by: naoto
---
 .../share/classes/java/text/MessageFormat.java         |  2 +-
 .../text/Format/MessageFormat/SerializationTest.java   | 10 ++++++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/java.base/share/classes/java/text/MessageFormat.java b/src/java.base/share/classes/java/text/MessageFormat.java
index 4a3ca0b2dcb..dbe312e8583 100644
--- a/src/java.base/share/classes/java/text/MessageFormat.java
+++ b/src/java.base/share/classes/java/text/MessageFormat.java
@@ -2041,7 +2041,7 @@ public class MessageFormat extends Format {
 
         // Check the correctness of arguments and offsets
         if (isValid) {
-            int lastOffset = patt.length() + 1;
+            int lastOffset = patt.length();
             for (int i = maxOff; i >= 0; --i) {
                 if (argNums[i] < 0 || argNums[i] >= MAX_ARGUMENT_INDEX
                         || offs[i] < 0 || offs[i] > lastOffset) {
diff --git a/test/jdk/java/text/Format/MessageFormat/SerializationTest.java b/test/jdk/java/text/Format/MessageFormat/SerializationTest.java
index 9191c5caef3..ac5fd4d56a7 100644
--- a/test/jdk/java/text/Format/MessageFormat/SerializationTest.java
+++ b/test/jdk/java/text/Format/MessageFormat/SerializationTest.java
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8331446
+ * @bug 8331446 8340554
  * @summary Check correctness of deserialization
  * @run junit SerializationTest
  */
@@ -70,7 +70,13 @@ public class SerializationTest {
                 // With null locale. (NPE not thrown, if no format defined)
                 new MessageFormat("{1} {0} foo", null),
                 // With formats
-                new MessageFormat("{0,number,short} {0} {1,date,long} foo")
+                new MessageFormat("{0,number,short} {0} {1,date,long} foo"),
+                // Offset equal to pattern length (0)
+                new MessageFormat("{0}"),
+                // Offset equal to pattern length (1)
+                new MessageFormat("X{0}"),
+                // Offset 1 under pattern length
+                new MessageFormat("X{0}X")
         );
     }