diff --git a/docs/ReleaseNotes.html b/docs/ReleaseNotes.html index 94b9e38..e382ef6 100644 --- a/docs/ReleaseNotes.html +++ b/docs/ReleaseNotes.html @@ -16,6 +16,10 @@ Bugs + + 2847577 + SafeArray#setString(*) incorrectly handles unicode strings (M3) + 2721937 System.getProperties call caused security exception in applet. diff --git a/jni/SafeArray.cpp b/jni/SafeArray.cpp index ccb92ea..4fa0c65 100644 --- a/jni/SafeArray.cpp +++ b/jni/SafeArray.cpp @@ -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;iGetObjectArrayElement(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;iGetObjectArrayElement(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 } -} \ No newline at end of file +} diff --git a/unittest/com/jacob/test/safearray/SafeArrayBasicTest.java b/unittest/com/jacob/test/safearray/SafeArrayBasicTest.java index 52fbef4..1d4fe10 100644 Binary files a/unittest/com/jacob/test/safearray/SafeArrayBasicTest.java and b/unittest/com/jacob/test/safearray/SafeArrayBasicTest.java differ