]> granicus.if.org Git - php/commitdiff
Use the correct lengths when building the name -> dispid mapping
authorWez Furlong <wez@php.net>
Thu, 29 Jul 2004 06:19:27 +0000 (06:19 +0000)
committerWez Furlong <wez@php.net>
Thu, 29 Jul 2004 06:19:27 +0000 (06:19 +0000)
ext/com_dotnet/com_wrapper.c

index 0a35d26d8d962d207fc1256fd07cb7b38ebf2d30..f9f35a34173d3ca5a7d122a09399a051a42d8382 100644 (file)
@@ -235,8 +235,11 @@ static HRESULT STDMETHODCALLTYPE disp_getdispid(
 
        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 @@ static HRESULT STDMETHODCALLTYPE disp_invokeex(
        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];
+               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));
+                               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;
+                               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 @@ static HRESULT STDMETHODCALLTYPE disp_invokeex(
                                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 @@ static HRESULT STDMETHODCALLTYPE disp_invokeex(
                }
        
                /* 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 @@ static void generate_dispids(php_dispatchex *disp TSRMLS_DC)
                        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 @@ static void generate_dispids(php_dispatchex *disp TSRMLS_DC)
                        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);
                }
        }
 }