From f349c3da24b07175f37cf55af512d3c9152fe8d0 Mon Sep 17 00:00:00 2001 From: Jonathan Lu Date: Mon, 13 Aug 2012 19:51:48 +0800 Subject: [PATCH] 7190219: (bf) CharBuffer.put(String,int,int) modifies position even if BufferOverflowException thrown Reviewed-by: alanb --- .../share/classes/java/nio/X-Buffer.java.template | 2 ++ jdk/test/java/nio/Buffer/Basic-X.java.template | 13 +++++++++++++ jdk/test/java/nio/Buffer/Basic.java | 2 +- jdk/test/java/nio/Buffer/BasicByte.java | 13 +++++++++++++ jdk/test/java/nio/Buffer/BasicChar.java | 13 +++++++++++++ jdk/test/java/nio/Buffer/BasicDouble.java | 13 +++++++++++++ jdk/test/java/nio/Buffer/BasicFloat.java | 13 +++++++++++++ jdk/test/java/nio/Buffer/BasicInt.java | 13 +++++++++++++ jdk/test/java/nio/Buffer/BasicLong.java | 13 +++++++++++++ jdk/test/java/nio/Buffer/BasicShort.java | 13 +++++++++++++ 10 files changed, 107 insertions(+), 1 deletion(-) diff --git a/jdk/src/share/classes/java/nio/X-Buffer.java.template b/jdk/src/share/classes/java/nio/X-Buffer.java.template index 49fec521798..4150b1edcba 100644 --- a/jdk/src/share/classes/java/nio/X-Buffer.java.template +++ b/jdk/src/share/classes/java/nio/X-Buffer.java.template @@ -888,6 +888,8 @@ public abstract class $Type$Buffer */ public $Type$Buffer put(String src, int start, int end) { checkBounds(start, end - start, src.length()); + if (end - start > remaining()) + throw new BufferOverflowException(); for (int i = start; i < end; i++) this.put(src.charAt(i)); return this; diff --git a/jdk/test/java/nio/Buffer/Basic-X.java.template b/jdk/test/java/nio/Buffer/Basic-X.java.template index b93f0533027..54435c2c49f 100644 --- a/jdk/test/java/nio/Buffer/Basic-X.java.template +++ b/jdk/test/java/nio/Buffer/Basic-X.java.template @@ -402,6 +402,19 @@ public class Basic$Type$ ck(b, b.charAt(1), 'f'); ck(b, b.subSequence(1, 3).toString().equals("fg")); + // String ops + + // 7190219 + b.clear(); + int pos = b.position(); + tryCatch(b, BufferOverflowException.class, new Runnable() { + public void run() { + b.put(String.valueOf(new char[b.capacity() + 1]), 0, + b.capacity() + 1); + }}); + ck(b, b.position(), pos); + relGet(b); + #end[char] // Compact diff --git a/jdk/test/java/nio/Buffer/Basic.java b/jdk/test/java/nio/Buffer/Basic.java index 414742e7536..86c1b443612 100644 --- a/jdk/test/java/nio/Buffer/Basic.java +++ b/jdk/test/java/nio/Buffer/Basic.java @@ -25,7 +25,7 @@ * @summary Unit test for buffers * @bug 4413135 4414911 4416536 4416562 4418782 4471053 4472779 4490253 4523725 * 4526177 4463011 4660660 4661219 4663521 4782970 4804304 4938424 6231529 - * 6221101 6234263 6535542 6591971 6593946 6795561 + * 6221101 6234263 6535542 6591971 6593946 6795561 7190219 * @author Mark Reinhold */ diff --git a/jdk/test/java/nio/Buffer/BasicByte.java b/jdk/test/java/nio/Buffer/BasicByte.java index f785cff3dcd..34856fa14b4 100644 --- a/jdk/test/java/nio/Buffer/BasicByte.java +++ b/jdk/test/java/nio/Buffer/BasicByte.java @@ -396,6 +396,19 @@ public class BasicByte + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicChar.java b/jdk/test/java/nio/Buffer/BasicChar.java index adff78cf453..d06772a961c 100644 --- a/jdk/test/java/nio/Buffer/BasicChar.java +++ b/jdk/test/java/nio/Buffer/BasicChar.java @@ -402,6 +402,19 @@ public class BasicChar ck(b, b.charAt(1), 'f'); ck(b, b.subSequence(1, 3).toString().equals("fg")); + // String ops + + // 7190219 + b.clear(); + int pos = b.position(); + tryCatch(b, BufferOverflowException.class, new Runnable() { + public void run() { + b.put(String.valueOf(new char[b.capacity() + 1]), 0, + b.capacity() + 1); + }}); + ck(b, b.position(), pos); + relGet(b); + // Compact diff --git a/jdk/test/java/nio/Buffer/BasicDouble.java b/jdk/test/java/nio/Buffer/BasicDouble.java index 1100f14e174..8ff9eb1f716 100644 --- a/jdk/test/java/nio/Buffer/BasicDouble.java +++ b/jdk/test/java/nio/Buffer/BasicDouble.java @@ -396,6 +396,19 @@ public class BasicDouble + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicFloat.java b/jdk/test/java/nio/Buffer/BasicFloat.java index 5973ab500f8..98e1989f2a1 100644 --- a/jdk/test/java/nio/Buffer/BasicFloat.java +++ b/jdk/test/java/nio/Buffer/BasicFloat.java @@ -396,6 +396,19 @@ public class BasicFloat + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicInt.java b/jdk/test/java/nio/Buffer/BasicInt.java index d302d1de41b..571d62f61bc 100644 --- a/jdk/test/java/nio/Buffer/BasicInt.java +++ b/jdk/test/java/nio/Buffer/BasicInt.java @@ -396,6 +396,19 @@ public class BasicInt + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicLong.java b/jdk/test/java/nio/Buffer/BasicLong.java index c024f7f49e4..7ea5d0326ff 100644 --- a/jdk/test/java/nio/Buffer/BasicLong.java +++ b/jdk/test/java/nio/Buffer/BasicLong.java @@ -396,6 +396,19 @@ public class BasicLong + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicShort.java b/jdk/test/java/nio/Buffer/BasicShort.java index 33b1c156027..176a53fe544 100644 --- a/jdk/test/java/nio/Buffer/BasicShort.java +++ b/jdk/test/java/nio/Buffer/BasicShort.java @@ -396,6 +396,19 @@ public class BasicShort + + + + + + + + + + + + +