Skip to content

Commit 7a3271c

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 `.uri` will reliably be `NULL` instead of garbage.
1 parent bf67f0d commit 7a3271c

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
@@ -956,14 +956,29 @@ PHP_METHOD(Uri_WhatWg_Url, __debugInfo)
956956
RETURN_ARR(uri_get_debug_properties(object));
957957
}
958958

959-
static zend_object *uri_create_object_handler(zend_class_entry *class_type)
959+
static uri_object_t *uri_create_object_handler(zend_class_entry *class_type, const uri_parser_t *parser)
960960
{
961961
uri_object_t *uri_object = zend_object_alloc(sizeof(*uri_object), class_type);
962962

963963
zend_object_std_init(&uri_object->std, class_type);
964964
object_properties_init(&uri_object->std, class_type);
965965

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

969984
static void uri_free_obj_handler(zend_object *object)
@@ -986,11 +1001,8 @@ zend_object *uri_clone_obj_handler(zend_object *object)
9861001

9871002
URI_ASSERT_INITIALIZATION(internal_uri);
9881003

989-
zend_object *new_object = uri_create_object_handler(object->ce);
990-
ZEND_ASSERT(new_object != NULL);
991-
uri_object_t *new_uri_object = uri_object_from_obj(new_object);
992-
993-
new_uri_object->internal.parser = internal_uri->parser;
1004+
uri_object_t *new_uri_object = uri_object_from_obj(object->ce->create_object(object->ce));
1005+
ZEND_ASSERT(new_uri_object->internal.parser == internal_uri->parser);
9941006

9951007
void *uri = internal_uri->parser->clone_uri(internal_uri->uri);
9961008
ZEND_ASSERT(uri != NULL);
@@ -1022,15 +1034,15 @@ PHPAPI zend_result php_uri_parser_register(const uri_parser_t *uri_parser)
10221034
static PHP_MINIT_FUNCTION(uri)
10231035
{
10241036
uri_rfc3986_uri_ce = register_class_Uri_Rfc3986_Uri();
1025-
uri_rfc3986_uri_ce->create_object = uri_create_object_handler;
1037+
uri_rfc3986_uri_ce->create_object = uri_create_object_handler_rfc3986;
10261038
uri_rfc3986_uri_ce->default_object_handlers = &uri_rfc3986_uri_object_handlers;
10271039
memcpy(&uri_rfc3986_uri_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
10281040
uri_rfc3986_uri_object_handlers.offset = XtOffsetOf(uri_object_t, std);
10291041
uri_rfc3986_uri_object_handlers.free_obj = uri_free_obj_handler;
10301042
uri_rfc3986_uri_object_handlers.clone_obj = uri_clone_obj_handler;
10311043

10321044
uri_whatwg_url_ce = register_class_Uri_WhatWg_Url();
1033-
uri_whatwg_url_ce->create_object = uri_create_object_handler;
1045+
uri_whatwg_url_ce->create_object = uri_create_object_handler_whatwg;
10341046
uri_whatwg_url_ce->default_object_handlers = &uri_whatwg_uri_object_handlers;
10351047
memcpy(&uri_whatwg_uri_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
10361048
uri_whatwg_uri_object_handlers.offset = XtOffsetOf(uri_object_t, std);

0 commit comments

Comments
 (0)