2488a51e82
* 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
141 lines
2.7 KiB
Java
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;
|
|
}
|