From 54f105525bfca9c2a44da17600013a23773be952 Mon Sep 17 00:00:00 2001 From: clay_shooter Date: Fri, 25 Dec 2009 17:18:16 +0000 Subject: [PATCH] 2847577 SafeArray#setString(*) incorrectly handles unicode strings --- docs/ReleaseNotes.html | 4 ++ jni/SafeArray.cpp | 58 ++++++++++-------- .../test/safearray/SafeArrayBasicTest.java | Bin 8036 -> 17930 bytes 3 files changed, 37 insertions(+), 25 deletions(-) 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 52fbef4492ef1ea27fbe973694a9d5aecabb7b32..1d4fe10a0f7eb7718326001481c8fe6a25d4d218 100644 GIT binary patch literal 17930 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 UV-Ips$!m1ubvV~E`Sr*D0CM8&H~;_u literal 8036 zcmd^ETW{Mo6n>U}1>u+2iK{er`?6#M)=Pj4=};hTUxEx^B-*AUi=Ig3vLgR|-ytc9 zw&m6-nzhIR$FfPD!|z;WeO&P5icbVf)I6T?L|w*4XcKEb7Q86<-C?IA=L=PsU?0umo1)tLd{ePHB&G4G5 zLNGOEJZIuo6p7TLh}nr@sS-NhG3;6ta(u_klp7`un+T)XCCp?uZiJMH+l5Flp2;i0 zIGdF@RuVFHqslC$B}a?j=<<%=v0R9h8O4e+XE)MJnO1Y_vN_LF=*R(RVWi46>&ZOH z%2ehPHZIhh$z01+kfOIqCKp=tV|J?46()dC0Cb`mF9c^mO9OvU5Ll@xD3~ngA~$TT z3i5xw9qIEs#`GEg`<+F3naPAD8P~dTB|I$?>rZiOM4oCE`ksC6bRzP8L|X8+--*1Q zYb9YcTyi!=`0LR0`jCktO@r`5StQ~OH~jp9{R%(bFgt;7pV`5H4F_z*?hmoPmS>uO z%u`WVNKT}l>-nsS{ncNfq>m)Qrj2M!-nGbV7WNt>SnA;c1#B*OVnljO%d4CP)KHaC zfg&qT{zfE`KUn(w5SOD3s^U!K6Enq~?w!N{_Yv#G(Z?e#dZkrQSE>0pyUot9A zEwWEMD@CtAu(6EVQ`yOX)f2vwHsqb3g`-wO?PtEp8D4flv+wn+;ccr*wf#rA|Mm71 ze~MQ2Kjg>g>nSf*D1acJ!Hl{&1shF?TaI>fNcxGKI(fE|DK}o$+fHZ_5`zY{z3D5A6Q1aU zr4|`zmxup^2$VRsCtxp$*QsJV><25c-7>{vIs3UVQw6e`_CS z67dbneO_ipK1(H7bs|4`2JRiF9C{P=T`|Ugmh(52kZw35wB=0Qh~kyoz@?8PX+ATs z2lR4%*$vhkpUHm!ae4g+PaSx*By;pJRz=ng5 zd@LO?a)OhCTWryy{~7ir-OD6XnY)u7oZnc-xKv=*#H@lqw_u{cW#_A#SysJ*?J4zB z8}8mZ2e7Jc?9S&0Bs8-^%}!TN>dHx7HBz3}*HdK0pd0bOWUBfGjxyCF|kf(Hv^*Z2>Ems*xsqa#8~b zgs5