Skip to content

Commit 7f080d3

Browse files
committed
Don't put xmlreader prop handler data on the heap
1 parent 06a89a9 commit 7f080d3

File tree

1 file changed

+24
-31
lines changed

1 file changed

+24
-31
lines changed

ext/xmlreader/php_xmlreader.c

+24-31
Original file line numberDiff line numberDiff line change
@@ -56,20 +56,17 @@ typedef struct _xmlreader_prop_handler {
5656
#define XMLREADER_LOAD_STRING 0
5757
#define XMLREADER_LOAD_FILE 1
5858

59-
/* {{{ xmlreader_register_prop_handler */
60-
static void xmlreader_register_prop_handler(HashTable *prop_handler, char *name, xmlreader_read_int_t read_int_func, xmlreader_read_const_char_t read_char_func, int rettype)
59+
static void xmlreader_register_prop_handler(HashTable *prop_handler, const char *name, size_t name_len, const xmlreader_prop_handler *hnd)
6160
{
62-
xmlreader_prop_handler hnd;
63-
zend_string *str;
64-
65-
hnd.read_char_func = read_char_func;
66-
hnd.read_int_func = read_int_func;
67-
hnd.type = rettype;
68-
str = zend_string_init_interned(name, strlen(name), 1);
69-
zend_hash_add_mem(prop_handler, str, &hnd, sizeof(xmlreader_prop_handler));
70-
zend_string_release_ex(str, 1);
61+
zend_string *str = zend_string_init_interned(name, name_len, true);
62+
zend_hash_add_new_ptr(prop_handler, str, (void *) hnd);
63+
zend_string_release_ex(str, true);
7164
}
72-
/* }}} */
65+
66+
#define XMLREADER_REGISTER_PROP_HANDLER(prop_handler, name, prop_read_int_func, prop_read_char_func, prop_type) do { \
67+
static const xmlreader_prop_handler hnd = {.read_int_func = prop_read_int_func, .read_char_func = prop_read_char_func, .type = prop_type}; \
68+
xmlreader_register_prop_handler(prop_handler, "" name, sizeof("" name) - 1, &hnd); \
69+
} while (0)
7370

7471
/* {{{ xmlreader_property_reader */
7572
static int xmlreader_property_reader(xmlreader_object *obj, xmlreader_prop_handler *hnd, zval *rv)
@@ -427,10 +424,6 @@ static void php_xmlreader_no_arg(INTERNAL_FUNCTION_PARAMETERS, xmlreader_read_in
427424
}
428425
/* }}} */
429426

430-
static void php_xmlreader_free_prop_handler(zval *el) /* {{{ */ {
431-
pefree(Z_PTR_P(el), 1);
432-
} /* }}} */
433-
434427
/* {{{ php_xmlreader_no_arg_string */
435428
static void php_xmlreader_no_arg_string(INTERNAL_FUNCTION_PARAMETERS, xmlreader_read_char_t internal_function) {
436429
zval *id;
@@ -1188,21 +1181,21 @@ PHP_MINIT_FUNCTION(xmlreader)
11881181
prev_zend_post_startup_cb = zend_post_startup_cb;
11891182
zend_post_startup_cb = xmlreader_fixup_temporaries;
11901183

1191-
zend_hash_init(&xmlreader_prop_handlers, 0, NULL, php_xmlreader_free_prop_handler, 1);
1192-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "attributeCount", xmlTextReaderAttributeCount, NULL, IS_LONG);
1193-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "baseURI", NULL, xmlTextReaderConstBaseUri, IS_STRING);
1194-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "depth", xmlTextReaderDepth, NULL, IS_LONG);
1195-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "hasAttributes", xmlTextReaderHasAttributes, NULL, _IS_BOOL);
1196-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "hasValue", xmlTextReaderHasValue, NULL, _IS_BOOL);
1197-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "isDefault", xmlTextReaderIsDefault, NULL, _IS_BOOL);
1198-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "isEmptyElement", xmlTextReaderIsEmptyElement, NULL, _IS_BOOL);
1199-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "localName", NULL, xmlTextReaderConstLocalName, IS_STRING);
1200-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "name", NULL, xmlTextReaderConstName, IS_STRING);
1201-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "namespaceURI", NULL, xmlTextReaderConstNamespaceUri, IS_STRING);
1202-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "nodeType", xmlTextReaderNodeType, NULL, IS_LONG);
1203-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "prefix", NULL, xmlTextReaderConstPrefix, IS_STRING);
1204-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "value", NULL, xmlTextReaderConstValue, IS_STRING);
1205-
xmlreader_register_prop_handler(&xmlreader_prop_handlers, "xmlLang", NULL, xmlTextReaderConstXmlLang, IS_STRING);
1184+
zend_hash_init(&xmlreader_prop_handlers, 0, NULL, NULL, true);
1185+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "attributeCount", xmlTextReaderAttributeCount, NULL, IS_LONG);
1186+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "baseURI", NULL, xmlTextReaderConstBaseUri, IS_STRING);
1187+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "depth", xmlTextReaderDepth, NULL, IS_LONG);
1188+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "hasAttributes", xmlTextReaderHasAttributes, NULL, _IS_BOOL);
1189+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "hasValue", xmlTextReaderHasValue, NULL, _IS_BOOL);
1190+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "isDefault", xmlTextReaderIsDefault, NULL, _IS_BOOL);
1191+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "isEmptyElement", xmlTextReaderIsEmptyElement, NULL, _IS_BOOL);
1192+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "localName", NULL, xmlTextReaderConstLocalName, IS_STRING);
1193+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "name", NULL, xmlTextReaderConstName, IS_STRING);
1194+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "namespaceURI", NULL, xmlTextReaderConstNamespaceUri, IS_STRING);
1195+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "nodeType", xmlTextReaderNodeType, NULL, IS_LONG);
1196+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "prefix", NULL, xmlTextReaderConstPrefix, IS_STRING);
1197+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "value", NULL, xmlTextReaderConstValue, IS_STRING);
1198+
XMLREADER_REGISTER_PROP_HANDLER(&xmlreader_prop_handlers, "xmlLang", NULL, xmlTextReaderConstXmlLang, IS_STRING);
12061199

12071200
return SUCCESS;
12081201
}

0 commit comments

Comments
 (0)