2847577 SafeArray#setString(*) incorrectly handles unicode strings

This commit is contained in:
clay_shooter
2009-12-25 17:18:16 +00:00
parent 1a651776d5
commit 54f105525b
3 changed files with 37 additions and 25 deletions

View File

@@ -16,6 +16,10 @@
<tr>
<td colspan="2"><b>Bugs</b></td>
</tr>
<tr>
<td width="13%" valign="top">2847577</td>
<td width="87%" valign="top">SafeArray#setString(*) incorrectly handles unicode strings (M3)</td>
</tr>
<tr>
<td width="13%" valign="top">2721937</td>
<td width="87%" valign="top">System.getProperties call caused security exception in applet.

View File

@@ -1867,18 +1867,20 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__ILjava_lang_Strin
if (vt == VT_VARIANT) {
VARIANT v;
VariantInit(&v);
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = bs.Copy();
SafeArrayPutElement(sa,&idx,&v); \
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
VariantClear(&v);
} else if (vt == VT_BSTR) {
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
SafeArrayPutElement(sa,&idx,bs.Detach());
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
} else {
ThrowComFail(env, "safearray cannot set string", 0);
}
@@ -1906,20 +1908,22 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString__IILjava_lang_Stri
if (vt == VT_VARIANT) {
VARIANT v;
VariantInit(&v);
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = bs.Copy();
long idx[2] = {i,j};
SafeArrayPutElement(sa,idx,&v);
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
VariantClear(&v);
} else if (vt == VT_BSTR) {
long idx[2] = {i,j};
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
SafeArrayPutElement(sa,idx,bs.Detach());
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
} else {
ThrowComFail(env, "safearray cannot set string", 0);
}
@@ -2000,24 +2004,26 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setStrings
for(int i=ja_start,j=idx;i<ja_start+nelem;i++,j++)
{
jstring s = (jstring)env->GetObjectArrayElement(ja, i);
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = bs.Copy();
long x = j;
SafeArrayPutElement(psa,&x,&v);
VariantClear(&v);
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
}
} else if (vt == VT_BSTR) {
for(int i=ja_start,j=idx;i<ja_start+nelem;i++,j++)
{
jstring s = (jstring)env->GetObjectArrayElement(ja, i);
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
long x = j;
SafeArrayPutElement(psa,&x,bs.Detach());
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
}
} else {
ThrowComFail(env, "safearray cannot set strings", 0);
@@ -3006,18 +3012,20 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setString___3ILjava_lang_Str
if (vt == VT_VARIANT) {
VARIANT v;
VariantInit(&v);
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = bs.Copy();
SafeArrayPutElement(sa, jIndices,&v);
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
VariantClear(&v);
} else if (vt == VT_BSTR) {
const char *str = env->GetStringUTFChars(s, NULL);
CComBSTR bs(str);
// SF 2847577 support unicode move from GetStringUTFChars() to GetStringChars()
const jchar *str = env->GetStringChars(s, NULL);
CComBSTR bs((LPCOLESTR)str);
SafeArrayPutElement(sa, jIndices,bs.Detach());
env->ReleaseStringUTFChars(s, str);
env->ReleaseStringChars(s, str);
} else {
ThrowComFail(env, "safearray cannot set string", 0);
}
@@ -3165,4 +3173,4 @@ JNIEXPORT void JNICALL Java_com_jacob_com_SafeArray_setBoolean___3IZ
}
}
}