diff options
author | Anthony Green <green@cygnus.com> | 2000-01-09 22:25:54 +0000 |
---|---|---|
committer | Anthony Green <green@gcc.gnu.org> | 2000-01-09 22:25:54 +0000 |
commit | b11f64301ac5a915a3803c6d6d4fa33b6733d187 (patch) | |
tree | 643466db439a80706c0651653ca6f845432f490d /libjava/java/lang | |
parent | 0e3dd56798d7650cafc05c87ccf429d85dd092f2 (diff) | |
download | gcc-b11f64301ac5a915a3803c6d6d4fa33b6733d187.zip gcc-b11f64301ac5a915a3803c6d6d4fa33b6733d187.tar.gz gcc-b11f64301ac5a915a3803c6d6d4fa33b6733d187.tar.bz2 |
natString.cc (init): Test for overflow condition during out of bounds check.
2000-01-09 Anthony Green <green@cygnus.com>
* java/lang/natString.cc (init): Test for overflow condition
during out of bounds check.
(getChars): Throw StringIndexOutOfBoundsException, not
ArrayIndexOutOfBoundsException.
(getBytes): Ditto.
(regionMatches): Obey case option during string comparison.
* configure.host (ligcj_interpreter): New variable. Enable
interpreter by default on IA-32.
* configure.in: Examine libgcj_interpreter.
* configure: Rebuilt.
From-SVN: r31300
Diffstat (limited to 'libjava/java/lang')
-rw-r--r-- | libjava/java/lang/natString.cc | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/libjava/java/lang/natString.cc b/libjava/java/lang/natString.cc index 88168e3..b5061d2 100644 --- a/libjava/java/lang/natString.cc +++ b/libjava/java/lang/natString.cc @@ -328,7 +328,8 @@ java::lang::String::init(jcharArray chars, jint offset, jint count, if (! chars) JvThrow (new NullPointerException); jsize data_size = JvGetArrayLength (chars); - if (offset < 0 || count < 0 || offset + count > data_size) + if (offset < 0 || count < 0 || offset + count < 0 + || offset + count > data_size) JvThrow (new StringIndexOutOfBoundsException()); jcharArray array; jchar *pdst; @@ -451,7 +452,7 @@ java::lang::String::getChars(jint srcBegin, jint srcEnd, jint dst_length = JvGetArrayLength (dst); if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count || dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) - JvThrow (new java::lang::ArrayIndexOutOfBoundsException()); + JvThrow (new java::lang::StringIndexOutOfBoundsException()); register jchar *dPtr = elements (dst) + dstBegin; register jchar *sPtr = JvGetStringChars (this) + srcBegin; register jint i = srcEnd-srcBegin; @@ -501,7 +502,7 @@ java::lang::String::getBytes(jint srcBegin, jint srcEnd, jint dst_length = JvGetArrayLength (dst); if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count || dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) - JvThrow (new java::lang::ArrayIndexOutOfBoundsException()); + JvThrow (new java::lang::StringIndexOutOfBoundsException()); register jbyte *dPtr = elements (dst) + dstBegin; register jchar *sPtr = JvGetStringChars (this) + srcBegin; register jint i = srcEnd-srcBegin; @@ -591,19 +592,25 @@ java::lang::String::regionMatches (jboolean ignoreCase, jint toffset, register jchar *tptr = JvGetStringChars (this) + toffset; register jchar *optr = JvGetStringChars (other) + ooffset; register jint i = len; - while (--i >= 0) - { - jchar tch = *tptr++; - jchar och = *optr++; - if (tch != och) - return false; - if (ignoreCase - && (java::lang::Character::toLowerCase (tch) - != java::lang::Character::toLowerCase (och)) - && (java::lang::Character::toUpperCase (tch) - != java::lang::Character::toUpperCase (och))) - return false; - } + if (ignoreCase) + while (--i >= 0) + { + jchar tch = *tptr++; + jchar och = *optr++; + if ((java::lang::Character::toLowerCase (tch) + != java::lang::Character::toLowerCase (och)) + && (java::lang::Character::toUpperCase (tch) + != java::lang::Character::toUpperCase (och))) + return false; + } + else + while (--i >= 0) + { + jchar tch = *tptr++; + jchar och = *optr++; + if (tch != och) + return false; + } return true; } |