This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: FYI: important memory-trashing fix
- From: Tom Tromey <tromey at redhat dot com>
- To: GCC libjava patches <java-patches at gcc dot gnu dot org>
- Date: 13 Nov 2003 18:36:32 -0700
- Subject: Patch: FYI: important memory-trashing fix
- Reply-to: tromey at redhat dot com
I'm checking this in on the trunk.
Tom Fitzsimmons' test case pointed this out.
It turns out that in many cases we were passing the wrong length to
JvGetStringUTFRegion. Perhaps we should add a new API that doesn't
take a length argument at all, since that seems to be the most common
use by far.
Tom
Index: ChangeLog
from Tom Tromey <tromey@redhat.com>
* jni.cc (_Jv_JNI_GetStringUTFChars): Pass length of string to
JvGetStringUTFRegion.
* java/lang/natPosixProcess.cc (new_string): Pass length of string
to JvGetStringUTFRegion.
* java/lang/natDouble.cc (parseDouble): Pass length of string to
JvGetStringUTFRegion.
* java/lang/natWin32Process.cc (startProcess): Pass length of
string to JvGetStringUTFRegion.
* java/lang/natClass.cc (forName): Pass length of string to
JvGetStringUTFRegion.
* gnu/gcj/runtime/natNameFinder.cc (getExternalLabel): Pass length
of string to JvGetStringUTFRegion.
* gnu/gcj/convert/natIconv.cc (init): Pass length of string to
JvGetStringUTFRegion.
* gnu/awt/gtk/natGtkLabelPeer.cc (setText): Pass length of string
to JvGetStringUTFRegion.
* gnu/awt/gtk/natGtkButtonPeer.cc (setLabel): Pass length of
string to JvGetStringUTFRegion.
Index: jni.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni.cc,v
retrieving revision 1.78
diff -u -r1.78 jni.cc
--- jni.cc 12 Nov 2003 05:56:43 -0000 1.78
+++ jni.cc 14 Nov 2003 01:43:36 -0000
@@ -1303,7 +1303,7 @@
try
{
char *r = (char *) _Jv_Malloc (len + 1);
- JvGetStringUTFRegion (string, 0, len, r);
+ JvGetStringUTFRegion (string, 0, string->length(), r);
r[len] = '\0';
if (isCopy)
Index: gnu/awt/gtk/natGtkButtonPeer.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/awt/gtk/natGtkButtonPeer.cc,v
retrieving revision 1.1
diff -u -r1.1 natGtkButtonPeer.cc
--- gnu/awt/gtk/natGtkButtonPeer.cc 12 Jan 2001 23:08:23 -0000 1.1
+++ gnu/awt/gtk/natGtkButtonPeer.cc 14 Nov 2003 01:43:36 -0000
@@ -19,7 +19,7 @@
// FIXME: this can allocate an unbounded amount. Should use heap
// even though it is slower.
if (label)
- JvGetStringUTFRegion (label, 0, len, buf);
+ JvGetStringUTFRegion (label, 0, label->length(), buf);
buf[len] = '\0';
// The button child is a label.
GtkBin *bin = GTK_BIN (ptr);
Index: gnu/awt/gtk/natGtkLabelPeer.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/awt/gtk/natGtkLabelPeer.cc,v
retrieving revision 1.1
diff -u -r1.1 natGtkLabelPeer.cc
--- gnu/awt/gtk/natGtkLabelPeer.cc 12 Jan 2001 23:08:23 -0000 1.1
+++ gnu/awt/gtk/natGtkLabelPeer.cc 14 Nov 2003 01:43:36 -0000
@@ -20,7 +20,7 @@
// even though it is slower.
char buf[len + 1];
if (text)
- JvGetStringUTFRegion (text, 0, len, buf);
+ JvGetStringUTFRegion (text, 0, text->length(), buf);
buf[len] = '\0';
gtk_label_set_text (GTK_LABEL (ptr), buf);
}
Index: gnu/gcj/convert/natIconv.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/gcj/convert/natIconv.cc,v
retrieving revision 1.15
diff -u -r1.15 natIconv.cc
--- gnu/gcj/convert/natIconv.cc 29 Jul 2003 16:38:48 -0000 1.15
+++ gnu/gcj/convert/natIconv.cc 14 Nov 2003 01:43:36 -0000
@@ -42,7 +42,7 @@
#ifdef HAVE_ICONV
jsize len = _Jv_GetStringUTFLength (encoding);
char buffer[len + 1];
- _Jv_GetStringUTFRegion (encoding, 0, len, buffer);
+ _Jv_GetStringUTFRegion (encoding, 0, encoding->length(), buffer);
buffer[len] = '\0';
iconv_t h = iconv_open ("UCS-2", buffer);
@@ -142,7 +142,7 @@
#ifdef HAVE_ICONV
jsize len = _Jv_GetStringUTFLength (encoding);
char buffer[len + 1];
- _Jv_GetStringUTFRegion (encoding, 0, len, buffer);
+ _Jv_GetStringUTFRegion (encoding, 0, encoding->length(), buffer);
buffer[len] = '\0';
iconv_t h = iconv_open (buffer, "UCS-2");
Index: gnu/gcj/runtime/natNameFinder.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/gcj/runtime/natNameFinder.cc,v
retrieving revision 1.4
diff -u -r1.4 natNameFinder.cc
--- gnu/gcj/runtime/natNameFinder.cc 10 Mar 2003 19:45:30 -0000 1.4
+++ gnu/gcj/runtime/natNameFinder.cc 14 Nov 2003 01:43:36 -0000
@@ -1,6 +1,6 @@
// natNameFinder.cc - native helper methods for NameFinder.java
-/* Copyright (C) 2002 Free Software Foundation, Inc
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc
This file is part of libgcj.
@@ -56,7 +56,7 @@
char *newName = (char *) JvMalloc (pfxLen + nameLen + 1);
*(newName + 0) = '\0';
strcpy (newName, LABEL_PREFIX);
- JvGetStringUTFRegion (name, 0, nameLen, newName + pfxLen);
+ JvGetStringUTFRegion (name, 0, name->length(), newName + pfxLen);
*(newName + pfxLen + nameLen) = '\0';
return JvNewStringLatin1 (newName);
}
Index: java/lang/natClass.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natClass.cc,v
retrieving revision 1.72
diff -u -r1.72 natClass.cc
--- java/lang/natClass.cc 4 Nov 2003 05:27:10 -0000 1.72
+++ java/lang/natClass.cc 14 Nov 2003 01:43:37 -0000
@@ -71,7 +71,7 @@
jsize length = _Jv_GetStringUTFLength (className);
char buffer[length];
- _Jv_GetStringUTFRegion (className, 0, length, buffer);
+ _Jv_GetStringUTFRegion (className, 0, className->length(), buffer);
_Jv_Utf8Const *name = _Jv_makeUtf8Const (buffer, length);
Index: java/lang/natDouble.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natDouble.cc,v
retrieving revision 1.16
diff -u -r1.16 natDouble.cc
--- java/lang/natDouble.cc 15 Apr 2002 03:11:12 -0000 1.16
+++ java/lang/natDouble.cc 14 Nov 2003 01:43:37 -0000
@@ -1,6 +1,6 @@
// natDouble.cc - Implementation of java.lang.Double native methods.
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation
This file is part of libgcj.
@@ -183,7 +183,7 @@
{
// Note that UTF can expand 3x.
char *data = (char *) __builtin_alloca (3 * length + 1);
- jsize blength = _Jv_GetStringUTFRegion (str, start, length, data);
+ jsize blength = _Jv_GetStringUTFRegion (str, start, str->length(), data);
data[blength] = 0;
struct _Jv_reent reent;
Index: java/lang/natPosixProcess.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natPosixProcess.cc,v
retrieving revision 1.14
diff -u -r1.14 natPosixProcess.cc
--- java/lang/natPosixProcess.cc 14 Aug 2002 19:53:54 -0000 1.14
+++ java/lang/natPosixProcess.cc 14 Nov 2003 01:43:37 -0000
@@ -1,6 +1,6 @@
// natPosixProcess.cc - Native side of POSIX process code.
-/* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2002, 2003 Free Software Foundation
This file is part of libgcj.
@@ -82,7 +82,7 @@
{
jsize s = _Jv_GetStringUTFLength (string);
char *buf = (char *) _Jv_Malloc (s + 1);
- _Jv_GetStringUTFRegion (string, 0, s, buf);
+ _Jv_GetStringUTFRegion (string, 0, string->length(), buf);
buf[s] = '\0';
return buf;
}
Index: java/lang/natWin32Process.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natWin32Process.cc,v
retrieving revision 1.7
diff -u -r1.7 natWin32Process.cc
--- java/lang/natWin32Process.cc 7 Nov 2003 03:16:49 -0000 1.7
+++ java/lang/natWin32Process.cc 14 Nov 2003 01:43:37 -0000
@@ -230,7 +230,7 @@
if (i > 0)
*cmdLineCurPos++ = ' ';
jsize s = _Jv_GetStringUTFLength (elts[i]);
- _Jv_GetStringUTFRegion (elts[i], 0, s, cmdLineCurPos);
+ _Jv_GetStringUTFRegion (elts[i], 0, elts[i]->length(), cmdLineCurPos);
cmdLineCurPos += s;
}
*cmdLineCurPos = '\0';
@@ -251,7 +251,7 @@
for (int i = 0; i < envp->length; ++i)
{
jsize s = _Jv_GetStringUTFLength (elts[i]);
- _Jv_GetStringUTFRegion (elts[i], 0, s, (env + j));
+ _Jv_GetStringUTFRegion (elts[i], 0, elts[i]->length(), (env + j));
j += s;
*(env + j) = '\0';