Skip to content

Commit 6b2ecfd

Browse files
committed
prevent segmentation fault when passing invalid arugment to protocolbufferrs\message::__construct
1 parent 4620209 commit 6b2ecfd

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

message.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,8 @@ static void php_protocolbuffers_message_set(INTERNAL_FUNCTION_PARAMETERS, zval *
529529

530530
if (Z_TYPE_PP(element) == IS_OBJECT) {
531531
if (scheme->ce != Z_OBJCE_PP(element)) {
532-
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "expected %s class. given %s class", scheme->ce->name, Z_OBJCE_P(value)->name);
532+
zval_ptr_dtor(&outer);
533+
zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "expected %s class. given %s class", scheme->ce->name, Z_OBJCE_PP(element)->name);
533534
return;
534535
} else {
535536
m = PHP_PROTOCOLBUFFERS_GET_OBJECT(php_protocolbuffers_message, *element);

tests/999_no41_constructor_should_accept_object.phpt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ foreach ($bar->getUsers() as $user) {
148148
echo $user->getId() . PHP_EOL;
149149
}
150150

151+
try {
152+
$var = new TestMessage(array('users' => array(
153+
array('id' => 1),
154+
new StdClass(),
155+
)));
156+
echo "FAULT" . PHP_EOL;
157+
} catch (InvalidArgumentException $e) {
158+
echo "OK" . PHP_EOL;
159+
}
151160
--EXPECT--
152161
1
153162
2
@@ -157,4 +166,5 @@ foreach ($bar->getUsers() as $user) {
157166
3
158167
1
159168
2
160-
3
169+
3
170+
OK

0 commit comments

Comments
 (0)