re PR libgcj/36252 (OutOfMemoryError on simple text conversion.)
authorDavid Daney <ddaney@avtrex.com>
Wed, 21 May 2008 03:49:03 +0000 (03:49 +0000)
committerDavid Daney <daney@gcc.gnu.org>
Wed, 21 May 2008 03:49:03 +0000 (03:49 +0000)
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

libjava/ChangeLog
libjava/java/lang/natString.cc
libjava/testsuite/libjava.lang/PR36252.jar [new file with mode: 0644]
libjava/testsuite/libjava.lang/PR36252.java [new file with mode: 0644]
libjava/testsuite/libjava.lang/PR36252.out [new file with mode: 0644]

index c639181..e8cd46e 100644 (file)
@@ -1,3 +1,16 @@
+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.
+
 2008-04-19  Tom Tromey  <tromey@redhat.com>
 
        PR libgcj/35979:
index f177c23..75006a7 100644 (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),
diff --git a/libjava/testsuite/libjava.lang/PR36252.jar b/libjava/testsuite/libjava.lang/PR36252.jar
new file mode 100644 (file)
index 0000000..2c0d2c0
Binary files /dev/null and b/libjava/testsuite/libjava.lang/PR36252.jar differ
diff --git a/libjava/testsuite/libjava.lang/PR36252.java b/libjava/testsuite/libjava.lang/PR36252.java
new file mode 100644 (file)
index 0000000..4f39a67
--- /dev/null
@@ -0,0 +1,16 @@
+import java.io.UnsupportedEncodingException;
+
+public class PR36252
+{
+  public static void main(String[] args)
+  {
+    try {
+      byte[] txt = new byte[] {-55, 87, -55, -42, -55, -20};
+      // This new String(...) should not throw an OutOfMemoryError.
+      String s = new String(txt, 0, 6, "MS932");
+    } catch (UnsupportedEncodingException e) {
+      // Silently ignore.
+    }
+    System.out.println("ok");
+  }
+}
diff --git a/libjava/testsuite/libjava.lang/PR36252.out b/libjava/testsuite/libjava.lang/PR36252.out
new file mode 100644 (file)
index 0000000..9766475
--- /dev/null
@@ -0,0 +1 @@
+ok