mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
8219597: (bf) Heap buffer state changes could provoke unexpected exceptions
Reviewed-by: alanb, rriggs
This commit is contained in:
parent
c79a1838e7
commit
a54066705f
1 changed files with 45 additions and 31 deletions
|
@ -104,11 +104,12 @@ class Heap$Type$Buffer$RW$
|
|||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -174,10 +175,11 @@ class Heap$Type$Buffer$RW$
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -219,10 +221,11 @@ class Heap$Type$Buffer$RW$
|
|||
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();
|
||||
|
@ -235,19 +238,22 @@ class Heap$Type$Buffer$RW$
|
|||
if (src == this)
|
||||
throw createSameBufferException();
|
||||
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);
|
||||
}
|
||||
|
@ -289,8 +295,10 @@ class Heap$Type$Buffer$RW$
|
|||
|
||||
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;
|
||||
|
@ -348,8 +356,9 @@ class Heap$Type$Buffer$RW$
|
|||
}
|
||||
|
||||
public CharBuffer asCharBuffer() {
|
||||
int size = this.remaining() >> 1;
|
||||
long addr = address + position();
|
||||
int pos = position();
|
||||
int size = (limit() - pos) >> 1;
|
||||
long addr = address + pos;
|
||||
return (bigEndian
|
||||
? (CharBuffer)(new ByteBufferAsCharBuffer$RW$B(this,
|
||||
-1,
|
||||
|
@ -399,8 +408,9 @@ class Heap$Type$Buffer$RW$
|
|||
}
|
||||
|
||||
public ShortBuffer asShortBuffer() {
|
||||
int size = this.remaining() >> 1;
|
||||
long addr = address + position();
|
||||
int pos = position();
|
||||
int size = (limit() - pos) >> 1;
|
||||
long addr = address + pos;
|
||||
return (bigEndian
|
||||
? (ShortBuffer)(new ByteBufferAsShortBuffer$RW$B(this,
|
||||
-1,
|
||||
|
@ -450,8 +460,9 @@ class Heap$Type$Buffer$RW$
|
|||
}
|
||||
|
||||
public IntBuffer asIntBuffer() {
|
||||
int size = this.remaining() >> 2;
|
||||
long addr = address + position();
|
||||
int pos = position();
|
||||
int size = (limit() - pos) >> 2;
|
||||
long addr = address + pos;
|
||||
return (bigEndian
|
||||
? (IntBuffer)(new ByteBufferAsIntBuffer$RW$B(this,
|
||||
-1,
|
||||
|
@ -501,8 +512,9 @@ class Heap$Type$Buffer$RW$
|
|||
}
|
||||
|
||||
public LongBuffer asLongBuffer() {
|
||||
int size = this.remaining() >> 3;
|
||||
long addr = address + position();
|
||||
int pos = position();
|
||||
int size = (limit() - pos) >> 3;
|
||||
long addr = address + pos;
|
||||
return (bigEndian
|
||||
? (LongBuffer)(new ByteBufferAsLongBuffer$RW$B(this,
|
||||
-1,
|
||||
|
@ -556,8 +568,9 @@ class Heap$Type$Buffer$RW$
|
|||
}
|
||||
|
||||
public FloatBuffer asFloatBuffer() {
|
||||
int size = this.remaining() >> 2;
|
||||
long addr = address + position();
|
||||
int pos = position();
|
||||
int size = (limit() - pos) >> 2;
|
||||
long addr = address + pos;
|
||||
return (bigEndian
|
||||
? (FloatBuffer)(new ByteBufferAsFloatBuffer$RW$B(this,
|
||||
-1,
|
||||
|
@ -611,8 +624,9 @@ class Heap$Type$Buffer$RW$
|
|||
}
|
||||
|
||||
public DoubleBuffer asDoubleBuffer() {
|
||||
int size = this.remaining() >> 3;
|
||||
long addr = address + position();
|
||||
int pos = position();
|
||||
int size = (limit() - pos) >> 3;
|
||||
long addr = address + pos;
|
||||
return (bigEndian
|
||||
? (DoubleBuffer)(new ByteBufferAsDoubleBuffer$RW$B(this,
|
||||
-1,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue