[php-src] Issue #8155: std_object_handlers not interceptable?
| From: | bwoebi | Date: | Sat, 26 Feb 2022 17:58:13 +0000 |
| Subject: | [php-src] Issue #8155: std_object_handlers not interceptable? | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-240048@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/8155
Comment Author: bwoebi
basically, in a bit of pseudo code:
```C
typedef struct {
zend_object_handlers *original_handlers;
zend_object (*original_create)(zend_class_entry *);
zend_object_handlers custom_handlers;
} original_class_data;
HashTable<zend_class_entry *, original_class_data> original_info;
void wrapped_custom_dtor(zend_object *obj) {
original_class_data *class_data = (original_class_data *)zend_hash_find_ptr(&original_info,
obj->ce);
// do some stuff
class_data->original_handlers->dtor_obj(obj);
}
zend_object *wrapper_create_object(zend_class_entry *ce) {
original_class_data *class_data = (original_class_data *)zend_hash_find_ptr(&original_info,
ce);
zend_object *obj = class_data->original_create(ce);
class_data->original_handlers = obj->handlers;
memcpy(&class_data->custom_handlers, obj->handlers, sizeof(zend_object_handlers));
// and whatever else you need to wrap
class_data->custom_handlers.dtor_obj = wrapped_custom_dtor;
obj->handlers = &class_data->custom_handlers;
return obj;
}
foreach (EG(class_table) as class_entry) {
original_class_data data;
data.original_create = class_entry->create_object;
class_entry->create_object = wrapper_create_object
zend_hash_add_ptr(&original_info, class_entry, &data);
}
```