aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
authorDavid Daney <ddaney@avtrex.com>2008-05-21 03:49:03 +0000
committerDavid Daney <daney@gcc.gnu.org>2008-05-21 03:49:03 +0000
commit32723ea0f97141dcc859af08906a52c7ddcc7278 (patch)
treee6e58a2d11b2eb0a13884ca5f7d7d4db1b0158ca /libjava/java
parent57b6cfda36af9a9e0743b9599c766d559eb0304d (diff)
downloadgcc-32723ea0f97141dcc859af08906a52c7ddcc7278.zip
gcc-32723ea0f97141dcc859af08906a52c7ddcc7278.tar.gz
gcc-32723ea0f97141dcc859af08906a52c7ddcc7278.tar.bz2
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
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/lang/natString.cc25
1 files changed, 23 insertions, 2 deletions
diff --git a/libjava/java/lang/natString.cc b/libjava/java/lang/natString.cc
index f177c23..75006a7 100644
--- a/libjava/java/lang/natString.cc
+++ b/libjava/java/lang/natString.cc
@@ -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),