re PR libgcj/36252 (OutOfMemoryError on simple text conversion.)

2008-05-20  David Daney  <ddaney@avtrex.com>

	PR libgcj/36252
	* java/lang/natString.ccn: Add
	#include <java/io/CharConversionException.h>.
	(init (byte[], int, int, String)): Catch and ignore
	CharConversionException.  Break out of conversion loop
	on incomplete input.
	* testsuite/libjava.lang/PR36252.java: New test.
	* testsuite/libjava.lang/PR36252.out: New file, its expected output.
	* testsuite/libjava.lang/PR36252.jar: New file, its pre-compiled
	jar file.

From-SVN: r135705
This commit is contained in:
David Daney 2008-05-21 03:49:03 +00:00 committed by David Daney
parent 57b6cfda36
commit 32723ea0f9
5 changed files with 53 additions and 2 deletions

View file

@ -1,6 +1,7 @@
// natString.cc - Implementation of java.lang.String native methods.
/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation
/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008 Free Software Foundation
This file is part of libgcj.
@ -23,6 +24,7 @@ details. */
#include <java/lang/NullPointerException.h>
#include <java/lang/StringBuffer.h>
#include <java/io/ByteArrayOutputStream.h>
#include <java/io/CharConversionException.h>
#include <java/io/OutputStreamWriter.h>
#include <java/io/ByteArrayInputStream.h>
#include <java/io/InputStreamReader.h>
@ -493,9 +495,28 @@ java::lang::String::init (jbyteArray bytes, jint offset, jint count,
converter->setInput(bytes, offset, offset+count);
while (converter->inpos < converter->inlength)
{
int done = converter->read(array, outpos, avail);
int done;
try
{
done = converter->read(array, outpos, avail);
}
catch (::java::io::CharConversionException *e)
{
// Ignore it and silently throw away the offending data.
break;
}
if (done == 0)
{
// done is zero if either there is no space available in the
// output *or* the input is incomplete. We assume that if
// there are 20 characters available in the output, the
// input must be incomplete and there is no more work to do.
// This means we may skip several bytes of input, but that
// is OK as the behavior is explicitly unspecified in this
// case.
if (avail - outpos > 20)
break;
jint new_size = 2 * (outpos + avail);
jcharArray new_array = JvNewCharArray (new_size);
memcpy (elements (new_array), elements (array),