gcc/libjava/testsuite/libjava.lang/String_overflow.java
Ralph Loader 2488a51e82 natString.cc (getChars): Fix validation of array indexes.
* java/lang/natString.cc (getChars):
	Fix validation of array indexes.
	(getBytes, regionMatches, startsWith, valueOf): Likewise.
	* testsuite/libjava.lang/String_overflow.java: New file.
	* testsuite/libjava.lang/String_overflow.out: New file.

From-SVN: r72578
2003-10-16 21:28:23 +00:00

141 lines
2.7 KiB
Java

class String_overflow
{
static void getChars()
{
String source = "abcdefg";
char[] dest = new char [3];
try
{
source.getChars (0, 5, // Source
dest, (1<<31) - 1);
Fail ("getChars", "Should not have succeeded");
}
catch (Throwable e)
{
ExpectArrayIndex ("getChars", e);
}
}
/* How do I stop a compiler warning causing a test to fail?
static void getBytes()
{
String source = "abcdefg";
byte[] dest = new byte[3];
try
{
source.getBytes (0, 5, dest, (1<<31) - 1);
Fail ("getBytes", "Should not have succeeded");
}
catch (Throwable e)
{
ExpectArrayIndex ("getBytes", e);
}
}
*/
static void regionMatches()
{
if ("abcdefg".regionMatches (4, "abcdefg", 4, -1))
{
Fail ("regionMatches", "Should not return true");
}
try
{
if ("abcdefg".regionMatches (4, "abcdefg", 4, (1<<31)-1))
{
Fail ("regionMatches (2nd)", "Should not return true");
}
}
catch (Throwable e)
{
Fail ("regionMatches (2nd)", e);
}
}
static void regionMatchesCase()
{
if ("abcdefg".regionMatches (true, 4, "abcdefg", 4, -1))
{
Fail ("regionMatchesCase", "Should not return true");
}
try
{
if ("abcdefg".regionMatches (true, 4, "abcdefg", 4, (1<<31)-1))
{
Fail ("regionMatchesCase (2nd)", "Should not return true");
}
}
catch (Throwable e)
{
Fail ("regionMatchesCase (2nd)", e);
}
}
static void startsWith()
{
// We make the arg pretty big to try and cause a segfault.
String s = new String ("abcdef");
StringBuffer b = new StringBuffer (1000000);
b.setLength (1000000);
String arg = new String (b);
try
{
s.startsWith (arg, (1<<31) - 1000000);
}
catch (Throwable e)
{
Fail ("startsWith", e);
}
}
static void valueOf()
{
char[] array = new char[] {'a', 'b', 'c', 'd', 'e'};
try
{
String.valueOf (array, 4, (1<<31)-1);
Fail ("valueOf", "should not succeed");
}
catch (Throwable e)
{
ExpectArrayIndex ("valueOf", e);
}
}
public static void main (String[] args) throws Throwable
{
getChars();
// getBytes();
regionMatches();
regionMatchesCase();
startsWith();
valueOf();
if (tests_failed == 0)
System.out.println ("ok");
}
static void ExpectArrayIndex (String test, Throwable e)
{
if (e instanceof ArrayIndexOutOfBoundsException)
return;
Fail (test, e);
}
static void Fail (String test, Object problem)
{
++tests_failed;
System.err.print (test);
System.err.print ('\t');
System.err.println (problem);
}
static int tests_failed;
}