dmitry          Thu Nov 27 14:50:06 2008 UTC

  Modified files:              
    /php-src/ext/soap   php_encoding.c 
    /php-src/ext/soap/tests/bugs        bug44882.phpt bug44882.wsdl 
  Log:
  Fixed bug #44882 (SOAP extension object decoding bug)
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_encoding.c?r1=1.172&r2=1.173&diff_format=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.172 
php-src/ext/soap/php_encoding.c:1.173
--- php-src/ext/soap/php_encoding.c:1.172       Sun Oct 26 01:58:25 2008
+++ php-src/ext/soap/php_encoding.c     Thu Nov 27 14:50:06 2008
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_encoding.c,v 1.172 2008/10/26 01:58:25 felipe Exp $ */
+/* $Id: php_encoding.c,v 1.173 2008/11/27 14:50:06 dmitry Exp $ */
 
 #include <time.h>
 
@@ -1388,7 +1388,7 @@
        sdlPtr sdl;
        sdlTypePtr sdlType = type->sdl_type;
        zend_class_entry *ce;
-       zend_bool redo_any = 0;
+       zval *redo_any = NULL;
        TSRMLS_FETCH();
 
        ce = ZEND_STANDARD_CLASS_DEF_PTR;
@@ -1462,10 +1462,7 @@
                                if (soap_check_xml_ref(&ret, data TSRMLS_CC)) {
                                        return ret;
                                }
-                               if (get_zval_property(ret, "any" TSRMLS_CC) != 
NULL) {
-                                       unset_zval_property(ret, "any" 
TSRMLS_CC);
-                                       redo_any = 1;
-                               }
+                               redo_any = get_zval_property(ret, "any" 
TSRMLS_CC);
                                if (Z_TYPE_P(ret) == IS_OBJECT && ce != 
ZEND_STANDARD_CLASS_DEF_PTR) {
                                        zend_object *zobj = 
zend_objects_get_address(ret TSRMLS_CC);
                                        zobj->ce = ce;
@@ -1491,10 +1488,17 @@
                        object_init_ex(ret, ce);
                }
                if (sdlType->model) {
+                       if (redo_any) {
+                               Z_ADDREF_P(redo_any);
+                               unset_zval_property(ret, "any" TSRMLS_CC);
+                       }
                        model_to_zval_object(ret, sdlType->model, data, sdl 
TSRMLS_CC);
-                       if (redo_any && get_zval_property(ret, "any" TSRMLS_CC) 
== NULL) {
-                               model_to_zval_any(ret, data->children 
TSRMLS_CC);                               
-                 }
+                       if (redo_any) {
+                               if (get_zval_property(ret, "any" TSRMLS_CC) == 
NULL) {
+                                       model_to_zval_any(ret, data->children 
TSRMLS_CC);
+                               }
+                               zval_ptr_dtor(&redo_any);
+                       }
                }
                if (sdlType->attributes) {
                        sdlAttributePtr *attr;
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug44882.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/soap/tests/bugs/bug44882.phpt
diff -u /dev/null php-src/ext/soap/tests/bugs/bug44882.phpt:1.2
--- /dev/null   Thu Nov 27 14:50:06 2008
+++ php-src/ext/soap/tests/bugs/bug44882.phpt   Thu Nov 27 14:50:06 2008
@@ -0,0 +1,64 @@
+--TEST--
+Bug #44882 (SOAP extension object decoding bug)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--INI--
+soap.wsdl_cache_enabled=0
+--FILE--
+<?php
+class TestSoapClient extends SoapClient
+{
+       public function __doRequest($req, $loc, $act, $ver, $oneway=0)
+       {
+               return <<<XML
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope 
+  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+  xmlns:ns="urn:ebay:api:PayPalAPI">
+  <SOAP-ENV:Body id="_0">
+    <GetExpressCheckoutDetailsResponse xmlns="urn:ebay:api:PayPalAPI">
+      <Timestamp>2008-06-23T14:51:08Z</Timestamp>
+      <Ack>Success</Ack>
+      <CorrelationID>ae013a0ccdf13</CorrelationID>
+      <Version>50.000000</Version>
+      <Build>588340</Build>
+      <GetExpressCheckoutDetailsResponseDetails 
xsi:type="ns:GetExpressCheckoutDetailsResponseDetailsType">
+        <Token>EC-11Y75137T2399952C</Token>
+        <PayerInfo>
+          <Payer>[EMAIL PROTECTED]</Payer>
+          <PayerID>MU82WA43YXM9C</PayerID>
+          <PayerStatus>verified</PayerStatus>
+        </PayerInfo>
+      </GetExpressCheckoutDetailsResponseDetails>
+    </GetExpressCheckoutDetailsResponse>
+  </SOAP-ENV:Body>
+</SOAP-ENV:Envelope>
+XML;
+       }
+}
+
+$client = new TestSoapClient(dirname(__FILE__).'/bug44882.wsdl');
+print_r($client->GetExpressCheckoutDetails());
+?>
+--EXPECT--
+stdClass Object
+(
+    [Timestamp] => 2008-06-23T14:51:08Z
+    [Ack] => Success
+    [CorrelationID] => ae013a0ccdf13
+    [Version] => 50.000000
+    [Build] => 588340
+    [GetExpressCheckoutDetailsResponseDetails] => stdClass Object
+        (
+            [Token] => EC-11Y75137T2399952C
+            [PayerInfo] => stdClass Object
+                (
+                    [Payer] => [EMAIL PROTECTED]
+                    [PayerID] => MU82WA43YXM9C
+                    [PayerStatus] => verified
+                )
+
+        )
+
+)
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug44882.wsdl?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/soap/tests/bugs/bug44882.wsdl
diff -u /dev/null php-src/ext/soap/tests/bugs/bug44882.wsdl:1.2
--- /dev/null   Thu Nov 27 14:50:06 2008
+++ php-src/ext/soap/tests/bugs/bug44882.wsdl   Thu Nov 27 14:50:06 2008
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wsdl:definitions
+       xmlns="http://schemas.xmlsoap.org/wsdl/";
+       xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
+       xmlns:xs="http://www.w3.org/2001/XMLSchema";
+       xmlns:ns="urn:ebay:api:PayPalAPI"
+       xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/";
+       targetNamespace="urn:ebay:api:PayPalAPI">
+       <wsdl:types>
+               <schema xmlns="http://www.w3.org/2001/XMLSchema"; 
targetNamespace="urn:ebay:api:PayPalAPI" elementFormDefault="qualified" 
attributeFormDefault="unqualified">
+                       <complexType name="PayerInfoType">
+                               <sequence>
+                                       <element name="Payer" type="xs:string" 
minOccurs="0"/>
+                                       <element name="PayerID" 
type="xs:string" minOccurs="0"/>
+                                       <element name="PayerStatus" 
type="xs:string" minOccurs="0"/>
+                               </sequence>
+                       </complexType>
+                       <complexType name="AbstractResponseType" 
abstract="true">
+                               <sequence>
+                                       <element name="Timestamp" 
type="xs:dateTime" minOccurs="0"/>
+                                       <element name="Ack" type="xs:string"/>
+                                       <element name="CorrelationID" 
type="xs:string" minOccurs="0"/>
+                                       <element name="Version" 
type="xs:string"/>
+                                       <element name="Build" type="xs:string"/>
+                                       <any processContents="lax" 
minOccurs="0"/>
+                               </sequence>
+                       </complexType>
+                       <xs:element 
name="GetExpressCheckoutDetailsResponseDetails" 
type="ns:GetExpressCheckoutDetailsResponseDetailsType"/>
+                       <xs:complexType 
name="GetExpressCheckoutDetailsResponseDetailsType">
+                               <xs:sequence>
+                                       <xs:element name="Token" 
type="xs:string"/>
+                                       <xs:element name="PayerInfo" 
type="ns:PayerInfoType"/>
+                               </xs:sequence>
+                       </xs:complexType>
+                       <xs:element name="GetExpressCheckoutDetailsResponse" 
type="ns:GetExpressCheckoutDetailsResponseType"/>
+                       <xs:complexType 
name="GetExpressCheckoutDetailsResponseType">
+                               <xs:complexContent>
+                                       <xs:extension 
base="ns:AbstractResponseType">
+                                               <xs:sequence>
+                                                       <xs:element 
ref="ns:GetExpressCheckoutDetailsResponseDetails" minOccurs="1" maxOccurs="1"/>
+                                               </xs:sequence>
+                                       </xs:extension>
+                               </xs:complexContent>
+                       </xs:complexType>
+               </schema>
+       </wsdl:types>
+       <wsdl:message name="GetExpressCheckoutDetailsRequest">
+       </wsdl:message>
+       <wsdl:message name="GetExpressCheckoutDetailsResponse">
+               <wsdl:part name="GetExpressCheckoutDetailsResponse" 
element="ns:GetExpressCheckoutDetailsResponse"/>
+       </wsdl:message>
+       <wsdl:portType name="PayPalAPIAAInterface">
+               <wsdl:operation name="GetExpressCheckoutDetails">
+                       <wsdl:input 
message="ns:GetExpressCheckoutDetailsRequest"/>
+                       <wsdl:output 
message="ns:GetExpressCheckoutDetailsResponse"/>
+               </wsdl:operation>
+       </wsdl:portType>
+       <wsdl:binding name="PayPalAPIAASoapBinding" 
type="ns:PayPalAPIAAInterface">
+               <wsdlsoap:binding style="document" 
transport="http://schemas.xmlsoap.org/soap/http"/>
+               <wsdl:operation name="GetExpressCheckoutDetails">
+                       <wsdlsoap:operation/>
+                       <wsdl:input>
+                               <wsdlsoap:body use="literal"/>
+                       </wsdl:input>
+                       <wsdl:output>
+                               <wsdlsoap:body use="literal"/>
+                       </wsdl:output>
+               </wsdl:operation>
+       </wsdl:binding>
+       <wsdl:service name="PayPalAPIInterfaceService">
+               <wsdl:port name="PayPalAPIAA" 
binding="ns:PayPalAPIAASoapBinding">
+                       <wsdlsoap:address location="test://"/>
+               </wsdl:port>
+       </wsdl:service>
+</wsdl:definitions>



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

Reply via email to