提交 7474dea2 编写于 作者: A andrew

8219597: (bf) Heap buffer state changes could provoke unexpected exceptions

Reviewed-by: mbalao
上级 42d4fd42
...@@ -95,11 +95,12 @@ class Heap$Type$Buffer$RW$ ...@@ -95,11 +95,12 @@ class Heap$Type$Buffer$RW$
} }
public $Type$Buffer slice() { public $Type$Buffer slice() {
int rem = this.remaining();
return new Heap$Type$Buffer$RW$(hb, return new Heap$Type$Buffer$RW$(hb,
-1, -1,
0, 0,
this.remaining(), rem,
this.remaining(), rem,
this.position() + offset); this.position() + offset);
} }
...@@ -147,10 +148,11 @@ class Heap$Type$Buffer$RW$ ...@@ -147,10 +148,11 @@ class Heap$Type$Buffer$RW$
public $Type$Buffer get($type$[] dst, int offset, int length) { public $Type$Buffer get($type$[] dst, int offset, int length) {
checkBounds(offset, length, dst.length); checkBounds(offset, length, dst.length);
if (length > remaining()) int pos = position();
if (length > limit() - pos)
throw new BufferUnderflowException(); throw new BufferUnderflowException();
System.arraycopy(hb, ix(position()), dst, offset, length); System.arraycopy(hb, ix(pos), dst, offset, length);
position(position() + length); position(pos + length);
return this; return this;
} }
...@@ -185,10 +187,11 @@ class Heap$Type$Buffer$RW$ ...@@ -185,10 +187,11 @@ class Heap$Type$Buffer$RW$
public $Type$Buffer put($type$[] src, int offset, int length) { public $Type$Buffer put($type$[] src, int offset, int length) {
#if[rw] #if[rw]
checkBounds(offset, length, src.length); checkBounds(offset, length, src.length);
if (length > remaining()) int pos = position();
if (length > limit() - pos)
throw new BufferOverflowException(); throw new BufferOverflowException();
System.arraycopy(src, offset, hb, ix(position()), length); System.arraycopy(src, offset, hb, ix(pos), length);
position(position() + length); position(pos + length);
return this; return this;
#else[rw] #else[rw]
throw new ReadOnlyBufferException(); throw new ReadOnlyBufferException();
...@@ -201,19 +204,22 @@ class Heap$Type$Buffer$RW$ ...@@ -201,19 +204,22 @@ class Heap$Type$Buffer$RW$
if (src == this) if (src == this)
throw new IllegalArgumentException(); throw new IllegalArgumentException();
Heap$Type$Buffer sb = (Heap$Type$Buffer)src; Heap$Type$Buffer sb = (Heap$Type$Buffer)src;
int n = sb.remaining(); int pos = position();
if (n > remaining()) int sbpos = sb.position();
int n = sb.limit() - sbpos;
if (n > limit() - pos)
throw new BufferOverflowException(); throw new BufferOverflowException();
System.arraycopy(sb.hb, sb.ix(sb.position()), System.arraycopy(sb.hb, sb.ix(sbpos),
hb, ix(position()), n); hb, ix(pos), n);
sb.position(sb.position() + n); sb.position(sbpos + n);
position(position() + n); position(pos + n);
} else if (src.isDirect()) { } else if (src.isDirect()) {
int n = src.remaining(); int n = src.remaining();
if (n > remaining()) int pos = position();
if (n > limit() - pos)
throw new BufferOverflowException(); throw new BufferOverflowException();
src.get(hb, ix(position()), n); src.get(hb, ix(pos), n);
position(position() + n); position(pos + n);
} else { } else {
super.put(src); super.put(src);
} }
...@@ -225,8 +231,10 @@ class Heap$Type$Buffer$RW$ ...@@ -225,8 +231,10 @@ class Heap$Type$Buffer$RW$
public $Type$Buffer compact() { public $Type$Buffer compact() {
#if[rw] #if[rw]
System.arraycopy(hb, ix(position()), hb, ix(0), remaining()); int pos = position();
position(remaining()); int rem = limit() - pos;
System.arraycopy(hb, ix(pos), hb, ix(0), rem);
position(rem);
limit(capacity()); limit(capacity());
discardMark(); discardMark();
return this; return this;
...@@ -284,8 +292,9 @@ class Heap$Type$Buffer$RW$ ...@@ -284,8 +292,9 @@ class Heap$Type$Buffer$RW$
} }
public CharBuffer asCharBuffer() { public CharBuffer asCharBuffer() {
int size = this.remaining() >> 1; int pos = position();
int off = offset + position(); int size = (limit() - pos) >> 1;
int off = offset + pos;
return (bigEndian return (bigEndian
? (CharBuffer)(new ByteBufferAsCharBuffer$RW$B(this, ? (CharBuffer)(new ByteBufferAsCharBuffer$RW$B(this,
-1, -1,
...@@ -335,8 +344,9 @@ class Heap$Type$Buffer$RW$ ...@@ -335,8 +344,9 @@ class Heap$Type$Buffer$RW$
} }
public ShortBuffer asShortBuffer() { public ShortBuffer asShortBuffer() {
int size = this.remaining() >> 1; int pos = position();
int off = offset + position(); int size = (limit() - pos) >> 1;
int off = offset + pos;
return (bigEndian return (bigEndian
? (ShortBuffer)(new ByteBufferAsShortBuffer$RW$B(this, ? (ShortBuffer)(new ByteBufferAsShortBuffer$RW$B(this,
-1, -1,
...@@ -386,8 +396,9 @@ class Heap$Type$Buffer$RW$ ...@@ -386,8 +396,9 @@ class Heap$Type$Buffer$RW$
} }
public IntBuffer asIntBuffer() { public IntBuffer asIntBuffer() {
int size = this.remaining() >> 2; int pos = position();
int off = offset + position(); int size = (limit() - pos) >> 2;
int off = offset + pos;
return (bigEndian return (bigEndian
? (IntBuffer)(new ByteBufferAsIntBuffer$RW$B(this, ? (IntBuffer)(new ByteBufferAsIntBuffer$RW$B(this,
-1, -1,
...@@ -437,8 +448,9 @@ class Heap$Type$Buffer$RW$ ...@@ -437,8 +448,9 @@ class Heap$Type$Buffer$RW$
} }
public LongBuffer asLongBuffer() { public LongBuffer asLongBuffer() {
int size = this.remaining() >> 3; int pos = position();
int off = offset + position(); int size = (limit() - pos) >> 3;
int off = offset + pos;
return (bigEndian return (bigEndian
? (LongBuffer)(new ByteBufferAsLongBuffer$RW$B(this, ? (LongBuffer)(new ByteBufferAsLongBuffer$RW$B(this,
-1, -1,
...@@ -488,8 +500,9 @@ class Heap$Type$Buffer$RW$ ...@@ -488,8 +500,9 @@ class Heap$Type$Buffer$RW$
} }
public FloatBuffer asFloatBuffer() { public FloatBuffer asFloatBuffer() {
int size = this.remaining() >> 2; int pos = position();
int off = offset + position(); int size = (limit() - pos) >> 2;
int off = offset + pos;
return (bigEndian return (bigEndian
? (FloatBuffer)(new ByteBufferAsFloatBuffer$RW$B(this, ? (FloatBuffer)(new ByteBufferAsFloatBuffer$RW$B(this,
-1, -1,
...@@ -539,8 +552,9 @@ class Heap$Type$Buffer$RW$ ...@@ -539,8 +552,9 @@ class Heap$Type$Buffer$RW$
} }
public DoubleBuffer asDoubleBuffer() { public DoubleBuffer asDoubleBuffer() {
int size = this.remaining() >> 3; int pos = position();
int off = offset + position(); int size = (limit() - pos) >> 3;
int off = offset + pos;
return (bigEndian return (bigEndian
? (DoubleBuffer)(new ByteBufferAsDoubleBuffer$RW$B(this, ? (DoubleBuffer)(new ByteBufferAsDoubleBuffer$RW$B(this,
-1, -1,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册