Skip to content

Commit

Permalink
Fixed possible crash because of uninitialized value (Zdash Urf)
Browse files Browse the repository at this point in the history
  • Loading branch information
dstogov committed Oct 17, 2007
1 parent af76115 commit 68bacdd
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 2 deletions.
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ PHP NEWS
- Improved and cleaned CGI code. FastCGI is now always enabled and can not be
disabled. See sapi/cgi/CHANGES for more details. (Dmitry)

- Fixed possible crash in ext/soap because of uninitialized value (Zdash Urf)

- Fixed bug #42919 (Unserializing of namespaced class object fails). (Dmitry)
- Fixed bug #42859 (import always conflicts with internal classes).
([email protected], Dmitry)
Expand Down
6 changes: 4 additions & 2 deletions ext/soap/php_encoding.c
Original file line number Diff line number Diff line change
Expand Up @@ -1208,9 +1208,10 @@ static zval* get_zval_property(zval* object, char* name TSRMLS_DC)
zval *data;
zend_class_entry *old_scope;

INIT_PZVAL(&member);
ZVAL_STRING(&member, name, 0);
old_scope = EG(scope);
EG(scope) = Z_OBJCE_P(object);
EG(scope) = Z_OBJCE_P(object);
data = Z_OBJ_HT_P(object)->read_property(object, &member, BP_VAR_IS TSRMLS_CC);
if (data == EG(uninitialized_zval_ptr)) {
/* Hack for bug #32455 */
Expand Down Expand Up @@ -1241,9 +1242,10 @@ static void unset_zval_property(zval* object, char* name TSRMLS_DC)
zval member;
zend_class_entry *old_scope;

INIT_PZVAL(&member);
ZVAL_STRING(&member, name, 0);
old_scope = EG(scope);
EG(scope) = Z_OBJCE_P(object);
EG(scope) = Z_OBJCE_P(object);
Z_OBJ_HT_P(object)->unset_property(object, &member TSRMLS_CC);
EG(scope) = old_scope;
} else if (Z_TYPE_P(object) == IS_ARRAY) {
Expand Down
66 changes: 66 additions & 0 deletions ext/soap/tests/classmap004.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
--TEST--
SOAP Classmap 4: encoding of objects with __get()
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
ini_set("soap.wsdl_cache_enabled",0);

class A {
public $a;
function __construct($a){
$this->x = $a;
}
function __get($name) {
return @$this->a[$name];
}
function __set($name, $val) {
$this->a[$name] = $val;
}
function __unset($name) {
unset($this->a[$name]);
}
}

class B extends A {
function __construct($a){
parent::__construct($a);
$this->y = $a + 1;
}
}

function f(){
return new B(5);
}

class LocalSoapClient extends SoapClient {

function __construct($wsdl, $options) {
parent::__construct($wsdl, $options);
$this->server = new SoapServer($wsdl, $options);
$this->server->addFunction("f");
}

function __doRequest($request, $location, $action, $version) {
ob_start();
$this->server->handle($request);
$response = ob_get_contents();
ob_end_clean();
return $response;
}
}

$client = new LocalSoapClient(dirname(__FILE__)."/classmap003.wsdl",
array('classmap'=>array('A'=>'A','B'=>'B')));
print_r($client->f());
?>
--EXPECT--
B Object
(
[a] => Array
(
[x] => 5
[y] => 6
)

)

0 comments on commit 68bacdd

Please sign in to comment.