ID:               37899
 Updated by:       [EMAIL PROTECTED]
 Reported By:      okumurya at hotmail dot com
 Status:           Assigned
 Bug Type:         COM related
 Operating System: Windows 2000 Professional
 PHP Version:      4.4.2
 Assigned To:      wez
 New Comment:

Could you provide some example reproducing the problem? Preferably with
some COM available on standard Windows/Office machine or easily
installable.


Previous Comments:
------------------------------------------------------------------------

[2007-03-05 22:43:52] okumurya at hotmail dot com

Hello fjortiz

> did your last patch work for you?

Yes my patch works.

------------------------------------------------------------------------

[2007-02-26 13:03:29] fjortiz at comunet dot es

Any updates on this issue?. We tracked down one problem we had with
ADODBCommand COM objects and Russian UTF-8 strings and found this was
the bug that was causing it. 

Mr. Okumurya, please one question: did your last patch work for you?

Thanks in advance.

------------------------------------------------------------------------

[2006-07-03 07:31:00] okumurya at hotmail dot com

I misunderstand.
Revised patch is following.

--- ext\com\conversion.c.orig   2006-01-01 22:46:50.000000000 +0900
+++ ext\com\conversion.c        2006-06-23 14:01:42.838476800 +0900
@@ -247,8 +247,9 @@
 
                        case VT_BSTR:
                                convert_to_string_ex(&pval_arg);
+                  
                                unicode_str = 
php_char_to_OLECHAR(Z_STRVAL_P(pval_arg),
Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
-                               V_BSTR(var_arg) = SysAllocStringByteLen((char 
*) unicode_str,
Z_STRLEN_P(pval_arg) * sizeof(OLECHAR));
+                               V_BSTR(var_arg) = SysAllocString(unicode_str);
                                efree(unicode_str);
                                break;
 
@@ -787,20 +788,15 @@
 {
        BOOL error = FALSE;
        OLECHAR *unicode_str;
+       uint unicode_strlen;
 
-       if (strlen == -1) {
-               /* request needed buffersize */
-               strlen = MultiByteToWideChar(codepage, (codepage == CP_UTF8 ? 0 
:
MB_PRECOMPOSED | MB_ERR_INVALID_CHARS), C_str, -1, NULL, 0);
-       } else {
-               /* \0 terminator */
-               strlen++;
-       }
+       unicode_strlen = MultiByteToWideChar(codepage, (codepage == CP_UTF8 ?
0 : MB_PRECOMPOSED | MB_ERR_INVALID_CHARS), C_str, -1, NULL, 0);
 
-       if (strlen >= 0) {
-               unicode_str = (OLECHAR *) emalloc(sizeof(OLECHAR) * strlen);
+       if (unicode_strlen > 0) {
+               unicode_str = (OLECHAR *) emalloc(sizeof(OLECHAR) *
unicode_strlen);
 
                /* convert string */
-               error = !MultiByteToWideChar(codepage, (codepage == CP_UTF8 ? 0 
:
MB_PRECOMPOSED | MB_ERR_INVALID_CHARS), C_str, strlen, unicode_str,
strlen);
+               error = !MultiByteToWideChar(codepage, (codepage == CP_UTF8 ? 0 
:
MB_PRECOMPOSED | MB_ERR_INVALID_CHARS), C_str, -1, unicode_str,
unicode_strlen);
        } else {
                /* return a zero-length string */
                unicode_str = (OLECHAR *) emalloc(sizeof(OLECHAR));

------------------------------------------------------------------------

[2006-06-23 05:09:36] okumurya at hotmail dot com

Description:
------------
In UTF-8, 'Z_STRLEN_P(pval_arg) * sizeof(OLECHAR)' is longer than
Widechar.
So SysAllocStringByteLen copies junk datas.

following is a patch.

--- conversion.c.orig   2006-06-23 11:28:06.496027200 +0900
+++ conversion.c        2006-06-23 14:01:42.838476800 +0900
@@ -247,8 +247,9 @@
 
                        case VT_BSTR:
                                convert_to_string_ex(&pval_arg);
+                  
                                unicode_str = 
php_char_to_OLECHAR(Z_STRVAL_P(pval_arg),
Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
-                               V_BSTR(var_arg) = SysAllocStringByteLen((char 
*) unicode_str,
Z_STRLEN_P(pval_arg) * sizeof(OLECHAR));
+                               V_BSTR(var_arg) = SysAllocString(unicode_str);
                                efree(unicode_str);
                                break;



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=37899&edit=1

Reply via email to