Skip to content

Commit

Permalink
Follow up #77849 PDOStatement objects in undefined state after clone
Browse files Browse the repository at this point in the history
  • Loading branch information
krakjoe committed Apr 5, 2019
1 parent 9ec1525 commit a2b8a62
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 17 deletions.
18 changes: 1 addition & 17 deletions ext/pdo/pdo_stmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -2266,22 +2266,6 @@ static int dbstmt_compare(zval *object1, zval *object2)
return -1;
}

static zend_object *dbstmt_clone_obj(zval *zobject)
{
pdo_stmt_t *stmt;
pdo_stmt_t *old_stmt;

stmt = ecalloc(1, sizeof(pdo_stmt_t) + zend_object_properties_size(Z_OBJCE_P(zobject)));
zend_object_std_init(&stmt->std, Z_OBJCE_P(zobject));
object_properties_init(&stmt->std, Z_OBJCE_P(zobject));

old_stmt = Z_PDO_STMT_P(zobject);

zend_objects_clone_members(&stmt->std, &old_stmt->std);

return &stmt->std;
}

zend_object_handlers pdo_dbstmt_object_handlers;
static int pdo_row_serialize(zval *object, unsigned char **buffer, size_t *buf_len, zend_serialize_data *data);

Expand All @@ -2304,7 +2288,7 @@ void pdo_stmt_init(void)
pdo_dbstmt_object_handlers.unset_property = dbstmt_prop_delete;
pdo_dbstmt_object_handlers.get_method = dbstmt_method_get;
pdo_dbstmt_object_handlers.compare_objects = dbstmt_compare;
pdo_dbstmt_object_handlers.clone_obj = dbstmt_clone_obj;
pdo_dbstmt_object_handlers.clone_obj = NULL;

INIT_CLASS_ENTRY(ce, "PDORow", pdo_row_functions);
pdo_row_ce = zend_register_internal_class(&ce);
Expand Down
18 changes: 18 additions & 0 deletions ext/pdo/tests/bug_77849_2.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
--TEST--
PDO Common: Bug #77849 (inconsistent state of cloned statament object)
--SKIPIF--
<?php
if (!extension_loaded('pdo')) die('skip');
?>
--FILE--
<?php
$stmt = new PDOStatement();

clone $stmt;
?>
--EXPECTF--
Fatal error: Uncaught Error: Trying to clone an uncloneable object of class PDOStatement in %s:4
Stack trace:
#0 {main}
thrown in %s on line 4

0 comments on commit a2b8a62

Please sign in to comment.