From 360754471cfd0d3e664cb06d39f68ef011a99b3a Mon Sep 17 00:00:00 2001 From: Alan Bateman Date: Fri, 21 Sep 2012 15:39:10 +0100 Subject: [PATCH] 7199551: (bf) CharBuffer.append(CharSequence) throws BufferOverflowException for read-only buffer Reviewed-by: iris, dxu, chegar --- .../classes/java/nio/X-Buffer.java.template | 4 +++ .../java/nio/Buffer/Basic-X.java.template | 28 +++++++++++++++++-- jdk/test/java/nio/Buffer/Basic.java | 2 +- jdk/test/java/nio/Buffer/BasicByte.java | 28 +++++++++++++++++-- jdk/test/java/nio/Buffer/BasicChar.java | 28 +++++++++++++++++-- jdk/test/java/nio/Buffer/BasicDouble.java | 28 +++++++++++++++++-- jdk/test/java/nio/Buffer/BasicFloat.java | 28 +++++++++++++++++-- jdk/test/java/nio/Buffer/BasicInt.java | 28 +++++++++++++++++-- jdk/test/java/nio/Buffer/BasicLong.java | 28 +++++++++++++++++-- jdk/test/java/nio/Buffer/BasicShort.java | 28 +++++++++++++++++-- 10 files changed, 213 insertions(+), 17 deletions(-) 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 4150b1edcba..322692428d7 100644 --- a/jdk/src/share/classes/java/nio/X-Buffer.java.template +++ b/jdk/src/share/classes/java/nio/X-Buffer.java.template @@ -741,6 +741,8 @@ public abstract class $Type$Buffer public $Type$Buffer put($Type$Buffer src) { if (src == this) throw new IllegalArgumentException(); + if (isReadOnly()) + throw new ReadOnlyBufferException(); int n = src.remaining(); if (n > remaining()) throw new BufferOverflowException(); @@ -888,6 +890,8 @@ public abstract class $Type$Buffer */ public $Type$Buffer put(String src, int start, int end) { checkBounds(start, end - start, src.length()); + if (isReadOnly()) + throw new ReadOnlyBufferException(); if (end - start > remaining()) throw new BufferOverflowException(); for (int i = start; i < end; i++) diff --git a/jdk/test/java/nio/Buffer/Basic-X.java.template b/jdk/test/java/nio/Buffer/Basic-X.java.template index 54435c2c49f..1548a9f8277 100644 --- a/jdk/test/java/nio/Buffer/Basic-X.java.template +++ b/jdk/test/java/nio/Buffer/Basic-X.java.template @@ -335,7 +335,7 @@ public class Basic$Type$ fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class Basic$Type$ fail(ex.getName() + " not thrown", b); } - private static void tryCatch($type$ [] t, Class ex, Runnable thunk) { + private static void tryCatch($type$ [] t, Class ex, Runnable thunk) { tryCatch($Type$Buffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class Basic$Type$ bulkPutBuffer(rb); }}); + // put($Type$Buffer) should not change source position + final $Type$Buffer src = $Type$Buffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -744,6 +752,22 @@ public class Basic$Type$ #end[byte] +#if[char] + + // 7199551 + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + String s = new String(new char[rb.remaining() + 1]); + rb.put(s); + }}); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + String s = new String(new char[rb.remaining() + 1]); + rb.append(s); + }}); + +#end[char] + if (rb.getClass().getName().startsWith("java.nio.Heap")) { tryCatch(b, ReadOnlyBufferException.class, new Runnable() { diff --git a/jdk/test/java/nio/Buffer/Basic.java b/jdk/test/java/nio/Buffer/Basic.java index 86c1b443612..0dba4c123b4 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 7190219 + * 6221101 6234263 6535542 6591971 6593946 6795561 7190219 7199551 * @author Mark Reinhold */ diff --git a/jdk/test/java/nio/Buffer/BasicByte.java b/jdk/test/java/nio/Buffer/BasicByte.java index 34856fa14b4..861a4335b5b 100644 --- a/jdk/test/java/nio/Buffer/BasicByte.java +++ b/jdk/test/java/nio/Buffer/BasicByte.java @@ -335,7 +335,7 @@ public class BasicByte fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class BasicByte fail(ex.getName() + " not thrown", b); } - private static void tryCatch(byte [] t, Class ex, Runnable thunk) { + private static void tryCatch(byte [] t, Class ex, Runnable thunk) { tryCatch(ByteBuffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class BasicByte bulkPutBuffer(rb); }}); + // put(ByteBuffer) should not change source position + final ByteBuffer src = ByteBuffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -744,6 +752,22 @@ public class BasicByte + + + + + + + + + + + + + + + + if (rb.getClass().getName().startsWith("java.nio.Heap")) { tryCatch(b, ReadOnlyBufferException.class, new Runnable() { diff --git a/jdk/test/java/nio/Buffer/BasicChar.java b/jdk/test/java/nio/Buffer/BasicChar.java index d06772a961c..b89916101bf 100644 --- a/jdk/test/java/nio/Buffer/BasicChar.java +++ b/jdk/test/java/nio/Buffer/BasicChar.java @@ -335,7 +335,7 @@ public class BasicChar fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class BasicChar fail(ex.getName() + " not thrown", b); } - private static void tryCatch(char [] t, Class ex, Runnable thunk) { + private static void tryCatch(char [] t, Class ex, Runnable thunk) { tryCatch(CharBuffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class BasicChar bulkPutBuffer(rb); }}); + // put(CharBuffer) should not change source position + final CharBuffer src = CharBuffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -741,6 +749,22 @@ public class BasicChar + + + + + + // 7199551 + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + String s = new String(new char[rb.remaining() + 1]); + rb.put(s); + }}); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + String s = new String(new char[rb.remaining() + 1]); + rb.append(s); + }}); diff --git a/jdk/test/java/nio/Buffer/BasicDouble.java b/jdk/test/java/nio/Buffer/BasicDouble.java index 8ff9eb1f716..97efe8f6847 100644 --- a/jdk/test/java/nio/Buffer/BasicDouble.java +++ b/jdk/test/java/nio/Buffer/BasicDouble.java @@ -335,7 +335,7 @@ public class BasicDouble fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class BasicDouble fail(ex.getName() + " not thrown", b); } - private static void tryCatch(double [] t, Class ex, Runnable thunk) { + private static void tryCatch(double [] t, Class ex, Runnable thunk) { tryCatch(DoubleBuffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class BasicDouble bulkPutBuffer(rb); }}); + // put(DoubleBuffer) should not change source position + final DoubleBuffer src = DoubleBuffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -727,6 +735,22 @@ public class BasicDouble + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicFloat.java b/jdk/test/java/nio/Buffer/BasicFloat.java index 98e1989f2a1..2f954934a05 100644 --- a/jdk/test/java/nio/Buffer/BasicFloat.java +++ b/jdk/test/java/nio/Buffer/BasicFloat.java @@ -335,7 +335,7 @@ public class BasicFloat fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class BasicFloat fail(ex.getName() + " not thrown", b); } - private static void tryCatch(float [] t, Class ex, Runnable thunk) { + private static void tryCatch(float [] t, Class ex, Runnable thunk) { tryCatch(FloatBuffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class BasicFloat bulkPutBuffer(rb); }}); + // put(FloatBuffer) should not change source position + final FloatBuffer src = FloatBuffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -727,6 +735,22 @@ public class BasicFloat + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicInt.java b/jdk/test/java/nio/Buffer/BasicInt.java index 571d62f61bc..a9ce0fb450b 100644 --- a/jdk/test/java/nio/Buffer/BasicInt.java +++ b/jdk/test/java/nio/Buffer/BasicInt.java @@ -335,7 +335,7 @@ public class BasicInt fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class BasicInt fail(ex.getName() + " not thrown", b); } - private static void tryCatch(int [] t, Class ex, Runnable thunk) { + private static void tryCatch(int [] t, Class ex, Runnable thunk) { tryCatch(IntBuffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class BasicInt bulkPutBuffer(rb); }}); + // put(IntBuffer) should not change source position + final IntBuffer src = IntBuffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -727,6 +735,22 @@ public class BasicInt + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicLong.java b/jdk/test/java/nio/Buffer/BasicLong.java index 7ea5d0326ff..82fb25b8a2d 100644 --- a/jdk/test/java/nio/Buffer/BasicLong.java +++ b/jdk/test/java/nio/Buffer/BasicLong.java @@ -335,7 +335,7 @@ public class BasicLong fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class BasicLong fail(ex.getName() + " not thrown", b); } - private static void tryCatch(long [] t, Class ex, Runnable thunk) { + private static void tryCatch(long [] t, Class ex, Runnable thunk) { tryCatch(LongBuffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class BasicLong bulkPutBuffer(rb); }}); + // put(LongBuffer) should not change source position + final LongBuffer src = LongBuffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -727,6 +735,22 @@ public class BasicLong + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/nio/Buffer/BasicShort.java b/jdk/test/java/nio/Buffer/BasicShort.java index 176a53fe544..9f8579d7510 100644 --- a/jdk/test/java/nio/Buffer/BasicShort.java +++ b/jdk/test/java/nio/Buffer/BasicShort.java @@ -335,7 +335,7 @@ public class BasicShort fail(problem + String.format(": x=%s y=%s", x, y), xb, yb); } - private static void tryCatch(Buffer b, Class ex, Runnable thunk) { + private static void tryCatch(Buffer b, Class ex, Runnable thunk) { boolean caught = false; try { thunk.run(); @@ -350,7 +350,7 @@ public class BasicShort fail(ex.getName() + " not thrown", b); } - private static void tryCatch(short [] t, Class ex, Runnable thunk) { + private static void tryCatch(short [] t, Class ex, Runnable thunk) { tryCatch(ShortBuffer.wrap(t), ex, thunk); } @@ -681,6 +681,14 @@ public class BasicShort bulkPutBuffer(rb); }}); + // put(ShortBuffer) should not change source position + final ShortBuffer src = ShortBuffer.allocate(1); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { + public void run() { + rb.put(src); + }}); + ck(src, src.position(), 0); + tryCatch(b, ReadOnlyBufferException.class, new Runnable() { public void run() { rb.compact(); @@ -727,6 +735,22 @@ public class BasicShort + + + + + + + + + + + + + + + +