wez             Thu Jul 29 02:19:27 2004 EDT

  Modified files:              
    /php-src/ext/com_dotnet     com_wrapper.c 
  Log:
  Use the correct lengths when building the name -> dispid mapping
  
  
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/com_wrapper.c?r1=1.5&r2=1.6&ty=u
Index: php-src/ext/com_dotnet/com_wrapper.c
diff -u php-src/ext/com_dotnet/com_wrapper.c:1.5 
php-src/ext/com_dotnet/com_wrapper.c:1.6
--- php-src/ext/com_dotnet/com_wrapper.c:1.5    Mon Jul 26 23:44:40 2004
+++ php-src/ext/com_dotnet/com_wrapper.c        Thu Jul 29 02:19:27 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: com_wrapper.c,v 1.5 2004/07/27 03:44:40 wez Exp $ */
+/* $Id: com_wrapper.c,v 1.6 2004/07/29 06:19:27 wez Exp $ */
 
 /* This module exports a PHP object as a COM object by wrapping it
  * using IDispatchEx */
@@ -235,8 +235,11 @@
 
        name = php_com_olestring_to_string(bstrName, &namelen, COMG(code_page) 
TSRMLS_CC);
 
+       trace("Looking for %s, namelen=%d in %p\n", name, namelen, 
disp->name_to_dispid);
+       
        /* Lookup the name in the hash */
        if (zend_hash_find(disp->name_to_dispid, name, namelen+1, (void**)&tmp) == 
SUCCESS) {
+               trace("found it\n");
                *pid = Z_LVAL_PP(tmp);
                ret = S_OK;
        }
@@ -268,22 +271,24 @@
        if (SUCCESS == zend_hash_index_find(disp->dispid_to_name, id, (void**)&name)) {
                /* TODO: add support for overloaded objects */
 
-               trace("-- Invoke: %d %20s flags=%08x args=%d\n", id, 
Z_STRVAL_PP(name), wFlags, pdp->cArgs);
+               trace("-- Invoke: %d %20s [%d] flags=%08x args=%d\n", id, 
Z_STRVAL_PP(name), Z_STRLEN_PP(name), wFlags, pdp->cArgs);
                
                /* convert args into zvals.
                 * Args are in reverse order */
-               params = (zval ***)safe_emalloc(sizeof(zval **), pdp->cArgs, 0);
-               for (i = 0; i < pdp->cArgs; i++) {
-                       VARIANT *arg;
-                       zval *zarg;
-                       
-                       arg = &pdp->rgvarg[ pdp->cArgs - 1 - i];
-
-                       trace("alloc zval for arg %d VT=%08x\n", i, V_VT(arg));
-
-                       ALLOC_INIT_ZVAL(zarg);
-                       php_com_wrap_variant(zarg, arg, COMG(code_page) TSRMLS_CC);
-                       params[i] = &zarg;
+               if (pdp->cArgs) {
+                       params = (zval ***)safe_emalloc(sizeof(zval **), pdp->cArgs, 
0);
+                       for (i = 0; i < pdp->cArgs; i++) {
+                               VARIANT *arg;
+                               zval *zarg;
+
+                               arg = &pdp->rgvarg[ pdp->cArgs - 1 - i];
+
+                               trace("alloc zval for arg %d VT=%08x\n", i, V_VT(arg));
+
+                               ALLOC_INIT_ZVAL(zarg);
+                               php_com_wrap_variant(zarg, arg, COMG(code_page) 
TSRMLS_CC);
+                               params[i] = &zarg;
+                       }
                }
 
                trace("arguments processed, prepare to do some work\n");        
@@ -300,10 +305,13 @@
                                if (SUCCESS == 
call_user_function_ex(EG(function_table), &disp->object, *name,
                                                        &retval, pdp->cArgs, params, 
1, NULL TSRMLS_CC)) {
                                        ret = S_OK;
+                                       trace("function called ok\n");
                                } else {
+                                       trace("failed to call func\n");
                                        ret = DISP_E_EXCEPTION;
                                }
                        } zend_catch {
+                               trace("something blew up\n");
                                ret = DISP_E_EXCEPTION;
                        } zend_end_try();
                } else {
@@ -311,9 +319,11 @@
                }
        
                /* release arguments */
-               for (i = 0; i < pdp->cArgs; i++)
-                       zval_ptr_dtor(params[i]);
-               efree(params);
+               if (params) {
+                       for (i = 0; i < pdp->cArgs; i++)
+                               zval_ptr_dtor(params[i]);
+                       efree(params);
+               }
                
                /* return value */
                if (retval) {
@@ -473,23 +483,23 @@
                        if (keytype == HASH_KEY_IS_LONG) {
                                sprintf(namebuf, "%d", pid);
                                name = namebuf;
-                               namelen = strlen(namebuf);
+                               namelen = strlen(namebuf)+1;
                        }
 
                        zend_hash_move_forward_ex(Z_OBJPROP_P(disp->object), &pos);
 
                        /* Find the existing id */
-                       if (zend_hash_find(disp->name_to_dispid, name, namelen+1, 
(void**)&tmp) == SUCCESS)
+                       if (zend_hash_find(disp->name_to_dispid, name, namelen, 
(void**)&tmp) == SUCCESS)
                                continue;
 
                        /* add the mappings */
                        MAKE_STD_ZVAL(tmp);
-                       ZVAL_STRINGL(tmp, name, namelen, 1);
+                       ZVAL_STRINGL(tmp, name, namelen-1, 1);
                        zend_hash_index_update(disp->dispid_to_name, pid, (void*)&tmp, 
sizeof(zval *), NULL);
 
                        MAKE_STD_ZVAL(tmp);
                        ZVAL_LONG(tmp, pid);
-                       zend_hash_update(disp->name_to_dispid, name, namelen+1, 
(void*)&tmp, sizeof(zval *), NULL);
+                       zend_hash_update(disp->name_to_dispid, name, namelen, 
(void*)&tmp, sizeof(zval *), NULL);
                }
        }
        
@@ -504,23 +514,23 @@
                        if (keytype == HASH_KEY_IS_LONG) {
                                sprintf(namebuf, "%d", pid);
                                name = namebuf;
-                               namelen = strlen(namebuf);
+                               namelen = strlen(namebuf) + 1;
                        }
 
                        zend_hash_move_forward_ex(Z_OBJPROP_P(disp->object), &pos);
 
                        /* Find the existing id */
-                       if (zend_hash_find(disp->name_to_dispid, name, namelen+1, 
(void**)&tmp) == SUCCESS)
+                       if (zend_hash_find(disp->name_to_dispid, name, namelen, 
(void**)&tmp) == SUCCESS)
                                continue;
 
                        /* add the mappings */
                        MAKE_STD_ZVAL(tmp);
-                       ZVAL_STRINGL(tmp, name, namelen, 1);
+                       ZVAL_STRINGL(tmp, name, namelen-1, 1);
                        zend_hash_index_update(disp->dispid_to_name, pid, (void*)&tmp, 
sizeof(zval *), NULL);
 
                        MAKE_STD_ZVAL(tmp);
                        ZVAL_LONG(tmp, pid);
-                       zend_hash_update(disp->name_to_dispid, name, namelen+1, 
(void*)&tmp, sizeof(zval *), NULL);
+                       zend_hash_update(disp->name_to_dispid, name, namelen, 
(void*)&tmp, sizeof(zval *), NULL);
                }
        }
 }

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to