diff options
author | Erik Osheim <d_m@plastic-idolatry.com> | 2012-12-17 23:28:08 -0500 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-01-04 11:48:38 -0800 |
commit | 92cf0e354e38d450bfe34d4612f9f869faec2baf (patch) | |
tree | 989fc06d6b2c8e372e17e6ebefbba32770ae789c /src/library | |
parent | e112ac94d04be7ee715ebf8724709123b0f3e1f6 (diff) | |
download | scala-92cf0e354e38d450bfe34d4612f9f869faec2baf.tar.gz scala-92cf0e354e38d450bfe34d4612f9f869faec2baf.tar.bz2 scala-92cf0e354e38d450bfe34d4612f9f869faec2baf.zip |
Fix Iterator#copyToArray (fixes SI-6827).
As pointed out in #scala, when using a non-zero start it's possible
to get an ArrayIndexOutOfBoundsException due to an incorrect bounds
check. This patch fixes this, as well as another potential bounds
error, and adds test cases.
Incorporates some other suggestions by Som-Snytt to ensure that
callers will get useful error messages in cases where the start
parameter is wrong (negative or out-of-array-bounds).
Review by @som-snytt.
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/collection/Iterator.scala | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala index cbf8cc4931..696bc4ab5c 100644 --- a/src/library/scala/collection/Iterator.scala +++ b/src/library/scala/collection/Iterator.scala @@ -1111,9 +1111,10 @@ trait Iterator[+A] extends TraversableOnce[A] { * $willNotTerminateInf */ def copyToArray[B >: A](xs: Array[B], start: Int, len: Int): Unit = { + require(start >= 0 && start < xs.length, s"start $start out of range ${xs.length}") var i = start - val end = start + math.min(len, xs.length) - while (hasNext && i < end) { + val end = start + math.min(len, xs.length - start) + while (i < end && hasNext) { xs(i) = next() i += 1 } |