<AWT Dev> Proposal: getGTKIcon with Unicode chars got StringIndexOutOfBoundsException
Ichiroh Takiguchi
takiguc at linux.vnet.ibm.com
Tue Jun 19 12:33:27 UTC 2018
Hello,
IBM would like to contribute a patch to OpenJDK project.
If a parameter of getGTKIcon contains multi-byte UTF-8 characters,
StringIndexOutOfBoundsException may occur.
The calculation of string length is confused.
We should tell UTF-8’s length and java.lang.String’s length.
Candidate fix is below. Can we have a sponsor of the fix?
------
--- old/src/java.desktop/unix/native/libawt_xawt/awt/awt_UNIXToolkit.c
2018-06-19 21:07:13.873993935 +0900
+++ new/src/java.desktop/unix/native/libawt_xawt/awt/awt_UNIXToolkit.c
2018-06-19 21:07:13.252007031 +0900
@@ -113,6 +113,7 @@
{
#ifndef HEADLESS
int len;
+ jsize jlen;
char *filename_str = NULL;
GError **error = NULL;
@@ -122,6 +123,7 @@
}
len = (*env)->GetStringUTFLength(env, filename);
+ jlen = (*env)->GetStringLength(env, filename);
filename_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
sizeof(char), len + 1);
if (filename_str == NULL) {
@@ -132,7 +134,7 @@
free(filename_str);
return JNI_FALSE;
}
- (*env)->GetStringUTFRegion(env, filename, 0, len, filename_str);
+ (*env)->GetStringUTFRegion(env, filename, 0, jlen, filename_str);
jboolean result = gtk->get_file_icon_data(env, filename_str, error,
icon_upcall_method, this);
@@ -159,6 +161,7 @@
{
#ifndef HEADLESS
int len;
+ jsize jlen;
char *stock_id_str = NULL;
char *detail_str = NULL;
@@ -168,25 +171,27 @@
}
len = (*env)->GetStringUTFLength(env, stock_id);
+ jlen = (*env)->GetStringLength(env, stock_id);
stock_id_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
sizeof(char), len + 1);
if (stock_id_str == NULL) {
JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
return JNI_FALSE;
}
- (*env)->GetStringUTFRegion(env, stock_id, 0, len, stock_id_str);
+ (*env)->GetStringUTFRegion(env, stock_id, 0, jlen, stock_id_str);
/* Detail isn't required so check for NULL. */
if (detail != NULL)
{
len = (*env)->GetStringUTFLength(env, detail);
+ jlen = (*env)->GetStringLength(env, detail);
detail_str = (char *)SAFE_SIZE_ARRAY_ALLOC(malloc,
sizeof(char), len + 1);
if (detail_str == NULL) {
JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
return JNI_FALSE;
}
- (*env)->GetStringUTFRegion(env, detail, 0, len, detail_str);
+ (*env)->GetStringUTFRegion(env, detail, 0, jlen, detail_str);
}
if (!init_method(env, this) ) {
------
Note that,
src/java.desktop/unix/native/libawt_xawt/awt/swing_GTKEngine.c has same
kind of code.
But buffer handling is not same, so I could not determine, I need to
change swing_GTKEngine.c or not.
Thanks,
Ichiroh Takiguchi
IBM Japan, Ltd.
More information about the awt-dev
mailing list