Mercurial > hg > release > icedtea7-forest-2.6 > jdk
changeset 9932:562298bad83c
8219597: (bf) Heap buffer state changes could provoke unexpected exceptions
Reviewed-by: mbalao
author | andrew |
---|---|
date | Mon, 06 Apr 2020 03:06:09 +0100 |
parents | ab59eebcf079 |
children | 3bdb32006248 |
files | src/share/classes/java/nio/Heap-X-Buffer.java.template |
diffstat | 1 files changed, 45 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/nio/Heap-X-Buffer.java.template Wed Jan 29 21:46:58 2020 +0300 +++ b/src/share/classes/java/nio/Heap-X-Buffer.java.template Mon Apr 06 03:06:09 2020 +0100 @@ -95,11 +95,12 @@ } public $Type$Buffer slice() { + int rem = this.remaining(); return new Heap$Type$Buffer$RW$(hb, -1, 0, - this.remaining(), - this.remaining(), + rem, + rem, this.position() + offset); } @@ -141,10 +142,11 @@ public $Type$Buffer get($type$[] dst, int offset, int length) { checkBounds(offset, length, dst.length); - if (length > remaining()) + int pos = position(); + if (length > limit() - pos) throw new BufferUnderflowException(); - System.arraycopy(hb, ix(position()), dst, offset, length); - position(position() + length); + System.arraycopy(hb, ix(pos), dst, offset, length); + position(pos + length); return this; } @@ -179,10 +181,11 @@ public $Type$Buffer put($type$[] src, int offset, int length) { #if[rw] checkBounds(offset, length, src.length); - if (length > remaining()) + int pos = position(); + if (length > limit() - pos) throw new BufferOverflowException(); - System.arraycopy(src, offset, hb, ix(position()), length); - position(position() + length); + System.arraycopy(src, offset, hb, ix(pos), length); + position(pos + length); return this; #else[rw] throw new ReadOnlyBufferException(); @@ -195,19 +198,22 @@ if (src == this) throw new IllegalArgumentException(); Heap$Type$Buffer sb = (Heap$Type$Buffer)src; - int n = sb.remaining(); - if (n > remaining()) + int pos = position(); + int sbpos = sb.position(); + int n = sb.limit() - sbpos; + if (n > limit() - pos) throw new BufferOverflowException(); - System.arraycopy(sb.hb, sb.ix(sb.position()), - hb, ix(position()), n); - sb.position(sb.position() + n); - position(position() + n); + System.arraycopy(sb.hb, sb.ix(sbpos), + hb, ix(pos), n); + sb.position(sbpos + n); + position(pos + n); } else if (src.isDirect()) { int n = src.remaining(); - if (n > remaining()) + int pos = position(); + if (n > limit() - pos) throw new BufferOverflowException(); - src.get(hb, ix(position()), n); - position(position() + n); + src.get(hb, ix(pos), n); + position(pos + n); } else { super.put(src); } @@ -219,8 +225,10 @@ public $Type$Buffer compact() { #if[rw] - System.arraycopy(hb, ix(position()), hb, ix(0), remaining()); - position(remaining()); + int pos = position(); + int rem = limit() - pos; + System.arraycopy(hb, ix(pos), hb, ix(0), rem); + position(rem); limit(capacity()); discardMark(); return this; @@ -278,8 +286,9 @@ } public CharBuffer asCharBuffer() { - int size = this.remaining() >> 1; - int off = offset + position(); + int pos = position(); + int size = (limit() - pos) >> 1; + int off = offset + pos; return (bigEndian ? (CharBuffer)(new ByteBufferAsCharBuffer$RW$B(this, -1, @@ -329,8 +338,9 @@ } public ShortBuffer asShortBuffer() { - int size = this.remaining() >> 1; - int off = offset + position(); + int pos = position(); + int size = (limit() - pos) >> 1; + int off = offset + pos; return (bigEndian ? (ShortBuffer)(new ByteBufferAsShortBuffer$RW$B(this, -1, @@ -380,8 +390,9 @@ } public IntBuffer asIntBuffer() { - int size = this.remaining() >> 2; - int off = offset + position(); + int pos = position(); + int size = (limit() - pos) >> 2; + int off = offset + pos; return (bigEndian ? (IntBuffer)(new ByteBufferAsIntBuffer$RW$B(this, -1, @@ -431,8 +442,9 @@ } public LongBuffer asLongBuffer() { - int size = this.remaining() >> 3; - int off = offset + position(); + int pos = position(); + int size = (limit() - pos) >> 3; + int off = offset + pos; return (bigEndian ? (LongBuffer)(new ByteBufferAsLongBuffer$RW$B(this, -1, @@ -482,8 +494,9 @@ } public FloatBuffer asFloatBuffer() { - int size = this.remaining() >> 2; - int off = offset + position(); + int pos = position(); + int size = (limit() - pos) >> 2; + int off = offset + pos; return (bigEndian ? (FloatBuffer)(new ByteBufferAsFloatBuffer$RW$B(this, -1, @@ -533,8 +546,9 @@ } public DoubleBuffer asDoubleBuffer() { - int size = this.remaining() >> 3; - int off = offset + position(); + int pos = position(); + int size = (limit() - pos) >> 3; + int off = offset + pos; return (bigEndian ? (DoubleBuffer)(new ByteBufferAsDoubleBuffer$RW$B(this, -1,