From 2e5f41272a94495b3f2d0a4ede7c21f36b976c69 Mon Sep 17 00:00:00 2001 From: alanb Date: Wed, 15 Apr 2009 14:53:34 +0100 Subject: [PATCH] 6795561: (bf) CharBuffer.subSequence() uses wrong capacity value for new buffer Reviewed-by: sherman, iris --- src/share/classes/java/nio/ByteBufferAs-X-Buffer.java | 10 ++++++---- src/share/classes/java/nio/Direct-X-Buffer.java | 10 ++++++---- src/share/classes/java/nio/Heap-X-Buffer.java | 9 ++++++--- src/share/classes/java/nio/StringCharBuffer.java | 6 ++++-- test/java/nio/Buffer/Basic-X.java | 9 +++++++-- test/java/nio/Buffer/Basic.java | 2 +- test/java/nio/Buffer/BasicByte.java | 5 +++++ test/java/nio/Buffer/BasicChar.java | 9 +++++++-- test/java/nio/Buffer/BasicDouble.java | 5 +++++ test/java/nio/Buffer/BasicFloat.java | 5 +++++ test/java/nio/Buffer/BasicInt.java | 5 +++++ test/java/nio/Buffer/BasicLong.java | 5 +++++ test/java/nio/Buffer/BasicShort.java | 5 +++++ 13 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java index 15626425a..60be7479c 100644 --- a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java +++ b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java @@ -196,10 +196,12 @@ class ByteBufferAs$Type$Buffer$RW$$BO$ // package-private if ((start < 0) || (end > len) || (start > end)) throw new IndexOutOfBoundsException(); - int sublen = end - start; - int off = offset + ((pos + start) << $LG_BYTES_PER_VALUE$); - assert (off >= 0); - return new ByteBufferAsCharBuffer$RW$$BO$(bb, -1, 0, sublen, sublen, off); + return new ByteBufferAsCharBuffer$RW$$BO$(bb, + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff --git a/src/share/classes/java/nio/Direct-X-Buffer.java b/src/share/classes/java/nio/Direct-X-Buffer.java index 5f738b781..a97762635 100644 --- a/src/share/classes/java/nio/Direct-X-Buffer.java +++ b/src/share/classes/java/nio/Direct-X-Buffer.java @@ -412,10 +412,12 @@ class Direct$Type$Buffer$RW$$BO$ if ((start < 0) || (end > len) || (start > end)) throw new IndexOutOfBoundsException(); - int sublen = end - start; - int off = (pos + start) << $LG_BYTES_PER_VALUE$; - assert (off >= 0); - return new DirectCharBuffer$RW$$BO$(this, -1, 0, sublen, sublen, off); + return new DirectCharBuffer$RW$$BO$(this, + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff --git a/src/share/classes/java/nio/Heap-X-Buffer.java b/src/share/classes/java/nio/Heap-X-Buffer.java index b615ba3c6..864161fa0 100644 --- a/src/share/classes/java/nio/Heap-X-Buffer.java +++ b/src/share/classes/java/nio/Heap-X-Buffer.java @@ -572,10 +572,13 @@ class Heap$Type$Buffer$RW$ || (end > length()) || (start > end)) throw new IndexOutOfBoundsException(); - int len = end - start; + int pos = position(); return new HeapCharBuffer$RW$(hb, - -1, 0, len, len, - offset + position() + start); + -1, + pos + start, + pos + end, + capacity(), + offset); } #end[char] diff --git a/src/share/classes/java/nio/StringCharBuffer.java b/src/share/classes/java/nio/StringCharBuffer.java index 648b1986f..8871b943f 100644 --- a/src/share/classes/java/nio/StringCharBuffer.java +++ b/src/share/classes/java/nio/StringCharBuffer.java @@ -102,10 +102,12 @@ class StringCharBuffer // package-private public final CharBuffer subSequence(int start, int end) { try { int pos = position(); - return new StringCharBuffer(str, -1, + return new StringCharBuffer(str, + -1, pos + checkIndex(start, pos), pos + checkIndex(end, pos), - remaining(), offset); + capacity(), + offset); } catch (IllegalArgumentException x) { throw new IndexOutOfBoundsException(); } diff --git a/test/java/nio/Buffer/Basic-X.java b/test/java/nio/Buffer/Basic-X.java index d4e1a2762..6612771de 100644 --- a/test/java/nio/Buffer/Basic-X.java +++ b/test/java/nio/Buffer/Basic-X.java @@ -365,8 +365,11 @@ public class Basic$Type$ b.position(2); ck(b, b.charAt(1), 'd'); - CharBuffer c = (CharBuffer)b.subSequence(1, 4); - ck(b, b.subSequence(1, 4).toString().equals("def")); + CharBuffer c = b.subSequence(1, 4); + ck(c, c.capacity(), b.capacity()); + ck(c, c.position(), b.position()+1); + ck(c, c.limit(), b.position()+4); + ck(c, b.subSequence(1, 4).toString().equals("def")); // 4938424 b.position(4); @@ -722,6 +725,8 @@ public class Basic$Type$ ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); + b.position(6); + ck(b, b.subSequence(0,3).toString().equals("ghi")); // The index, relative to the position, must be non-negative and // smaller than remaining(). diff --git a/test/java/nio/Buffer/Basic.java b/test/java/nio/Buffer/Basic.java index c0c420f84..b8ed89bb3 100644 --- a/test/java/nio/Buffer/Basic.java +++ b/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 + * 6221101 6234263 6535542 6591971 6593946 6795561 * @author Mark Reinhold */ diff --git a/test/java/nio/Buffer/BasicByte.java b/test/java/nio/Buffer/BasicByte.java index 0f5ac6f6e..7e259a141 100644 --- a/test/java/nio/Buffer/BasicByte.java +++ b/test/java/nio/Buffer/BasicByte.java @@ -371,6 +371,9 @@ public class BasicByte + + + @@ -783,6 +786,8 @@ public class BasicByte + + diff --git a/test/java/nio/Buffer/BasicChar.java b/test/java/nio/Buffer/BasicChar.java index 28eb49fb5..a0df9fcf3 100644 --- a/test/java/nio/Buffer/BasicChar.java +++ b/test/java/nio/Buffer/BasicChar.java @@ -365,8 +365,11 @@ public class BasicChar b.position(2); ck(b, b.charAt(1), 'd'); - CharBuffer c = (CharBuffer)b.subSequence(1, 4); - ck(b, b.subSequence(1, 4).toString().equals("def")); + CharBuffer c = b.subSequence(1, 4); + ck(c, c.capacity(), b.capacity()); + ck(c, c.position(), b.position()+1); + ck(c, c.limit(), b.position()+4); + ck(c, b.subSequence(1, 4).toString().equals("def")); // 4938424 b.position(4); @@ -722,6 +725,8 @@ public class BasicChar ck(b, start, b.position()); ck(b, end, b.limit()); ck(b, s.length(), b.capacity()); + b.position(6); + ck(b, b.subSequence(0,3).toString().equals("ghi")); // The index, relative to the position, must be non-negative and // smaller than remaining(). diff --git a/test/java/nio/Buffer/BasicDouble.java b/test/java/nio/Buffer/BasicDouble.java index b2a1be65a..a627d0e91 100644 --- a/test/java/nio/Buffer/BasicDouble.java +++ b/test/java/nio/Buffer/BasicDouble.java @@ -371,6 +371,9 @@ public class BasicDouble + + + @@ -783,6 +786,8 @@ public class BasicDouble + + diff --git a/test/java/nio/Buffer/BasicFloat.java b/test/java/nio/Buffer/BasicFloat.java index b6b5ea0db..730dcbeac 100644 --- a/test/java/nio/Buffer/BasicFloat.java +++ b/test/java/nio/Buffer/BasicFloat.java @@ -371,6 +371,9 @@ public class BasicFloat + + + @@ -783,6 +786,8 @@ public class BasicFloat + + diff --git a/test/java/nio/Buffer/BasicInt.java b/test/java/nio/Buffer/BasicInt.java index 938ada295..b20e4bb10 100644 --- a/test/java/nio/Buffer/BasicInt.java +++ b/test/java/nio/Buffer/BasicInt.java @@ -371,6 +371,9 @@ public class BasicInt + + + @@ -783,6 +786,8 @@ public class BasicInt + + diff --git a/test/java/nio/Buffer/BasicLong.java b/test/java/nio/Buffer/BasicLong.java index 17537a71f..0d4c568e1 100644 --- a/test/java/nio/Buffer/BasicLong.java +++ b/test/java/nio/Buffer/BasicLong.java @@ -371,6 +371,9 @@ public class BasicLong + + + @@ -783,6 +786,8 @@ public class BasicLong + + diff --git a/test/java/nio/Buffer/BasicShort.java b/test/java/nio/Buffer/BasicShort.java index dc9c7db38..58e5a3e6d 100644 --- a/test/java/nio/Buffer/BasicShort.java +++ b/test/java/nio/Buffer/BasicShort.java @@ -371,6 +371,9 @@ public class BasicShort + + + @@ -783,6 +786,8 @@ public class BasicShort + + -- GitLab