Skip to content

Commit 2610f39

Browse files
committed
uri: Initialize the .internal field of uri_object_t immediately upon creation
This makes the objects much safer to use, since the `.parser` will always be available and matching the object.
1 parent 4fcc6ae commit 2610f39

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed

ext/uri/php_uri.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -954,14 +954,29 @@ PHP_METHOD(Uri_WhatWg_Url, __debugInfo)
954954
RETURN_ARR(uri_get_debug_properties(object));
955955
}
956956

957-
static zend_object *uri_create_object_handler(zend_class_entry *class_type)
957+
static uri_object_t *uri_create_object_handler(zend_class_entry *class_type, const uri_parser_t *parser)
958958
{
959959
uri_object_t *uri_object = zend_object_alloc(sizeof(*uri_object), class_type);
960960

961961
zend_object_std_init(&uri_object->std, class_type);
962962
object_properties_init(&uri_object->std, class_type);
963963

964-
return &uri_object->std;
964+
uri_object->internal = (uri_internal_t){
965+
.parser = parser,
966+
.uri = NULL,
967+
};
968+
969+
return uri_object;
970+
}
971+
972+
static zend_object *uri_create_object_handler_rfc3986(zend_class_entry *ce)
973+
{
974+
return &uri_create_object_handler(ce, &php_uri_parser_rfc3986)->std;
975+
}
976+
977+
static zend_object *uri_create_object_handler_whatwg(zend_class_entry *ce)
978+
{
979+
return &uri_create_object_handler(ce, &php_uri_parser_whatwg)->std;
965980
}
966981

967982
static void uri_free_obj_handler(zend_object *object)
@@ -984,11 +999,8 @@ static zend_object *uri_clone_obj_handler(zend_object *object)
984999

9851000
URI_ASSERT_INITIALIZATION(internal_uri);
9861001

987-
zend_object *new_object = uri_create_object_handler(object->ce);
988-
ZEND_ASSERT(new_object != NULL);
989-
uri_object_t *new_uri_object = uri_object_from_obj(new_object);
990-
991-
new_uri_object->internal.parser = internal_uri->parser;
1002+
uri_object_t *new_uri_object = uri_object_from_obj(object->ce->create_object(object->ce));
1003+
ZEND_ASSERT(new_uri_object->internal.parser == internal_uri->parser);
9921004

9931005
void *uri = internal_uri->parser->clone_uri(internal_uri->uri);
9941006
ZEND_ASSERT(uri != NULL);
@@ -1020,15 +1032,15 @@ PHPAPI zend_result php_uri_parser_register(const uri_parser_t *uri_parser)
10201032
static PHP_MINIT_FUNCTION(uri)
10211033
{
10221034
uri_rfc3986_uri_ce = register_class_Uri_Rfc3986_Uri();
1023-
uri_rfc3986_uri_ce->create_object = uri_create_object_handler;
1035+
uri_rfc3986_uri_ce->create_object = uri_create_object_handler_rfc3986;
10241036
uri_rfc3986_uri_ce->default_object_handlers = &uri_rfc3986_uri_object_handlers;
10251037
memcpy(&uri_rfc3986_uri_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
10261038
uri_rfc3986_uri_object_handlers.offset = XtOffsetOf(uri_object_t, std);
10271039
uri_rfc3986_uri_object_handlers.free_obj = uri_free_obj_handler;
10281040
uri_rfc3986_uri_object_handlers.clone_obj = uri_clone_obj_handler;
10291041

10301042
uri_whatwg_url_ce = register_class_Uri_WhatWg_Url();
1031-
uri_whatwg_url_ce->create_object = uri_create_object_handler;
1043+
uri_whatwg_url_ce->create_object = uri_create_object_handler_whatwg;
10321044
uri_whatwg_url_ce->default_object_handlers = &uri_whatwg_uri_object_handlers;
10331045
memcpy(&uri_whatwg_uri_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
10341046
uri_whatwg_uri_object_handlers.offset = XtOffsetOf(uri_object_t, std);

0 commit comments

Comments
 (0)