]> granicus.if.org Git - php/commitdiff
MFB:
authorFelipe Pena <felipe@php.net>
Sun, 24 Aug 2008 02:12:51 +0000 (02:12 +0000)
committerFelipe Pena <felipe@php.net>
Sun, 24 Aug 2008 02:12:51 +0000 (02:12 +0000)
- New parameter parsing API
- Fixed crash in xml_parse_into_struct

ext/xml/xml.c

index 09e560fefc8743cc6ebb81c4dff0ffa282ac68ba..9a5a921abc3021c7dba022f9a59de5b587781364 100644 (file)
@@ -1340,19 +1340,13 @@ PHP_FUNCTION(xml_parser_create_ns)
 PHP_FUNCTION(xml_set_object)
 {
        xml_parser *parser;
-       zval **pind, **mythis;
+       zval *pind, *mythis;
 
-       if (ZEND_NUM_ARGS() != 2 ||
-               zend_get_parameters_ex(2, &pind, &mythis) == FAILURE) {
-               WRONG_PARAM_COUNT;
-       }
-
-       if (Z_TYPE_PP(mythis) != IS_OBJECT) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument 2 has wrong type");
-               RETURN_FALSE;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ro", &pind, &mythis) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *,pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        /* please leave this commented - or ask thies@thieso.net before doing it (again) */
        if (parser->object) {
@@ -1365,7 +1359,7 @@ PHP_FUNCTION(xml_set_object)
 #endif */
 
        ALLOC_ZVAL(parser->object);
-       *parser->object = **mythis;
+       *parser->object = *mythis;
        zval_copy_ctor(parser->object);
        INIT_PZVAL(parser->object);
 
@@ -1378,14 +1372,13 @@ PHP_FUNCTION(xml_set_object)
 PHP_FUNCTION(xml_set_element_handler)
 {
        xml_parser *parser;
-       zval **pind, **shdl, **ehdl;
+       zval *pind, **shdl, **ehdl;
 
-       if (ZEND_NUM_ARGS() != 3 ||
-               zend_get_parameters_ex(3, &pind, &shdl, &ehdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZZ", &pind, &shdl, &ehdl) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *,pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->startElementHandler, shdl TSRMLS_CC);
        xml_set_handler(&parser->endElementHandler, ehdl TSRMLS_CC);
@@ -1399,13 +1392,13 @@ PHP_FUNCTION(xml_set_element_handler)
 PHP_FUNCTION(xml_set_character_data_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->characterDataHandler, hdl TSRMLS_CC);
        XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler);
@@ -1418,13 +1411,13 @@ PHP_FUNCTION(xml_set_character_data_handler)
 PHP_FUNCTION(xml_set_processing_instruction_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->processingInstructionHandler, hdl TSRMLS_CC);
        XML_SetProcessingInstructionHandler(parser->parser, _xml_processingInstructionHandler);
@@ -1437,12 +1430,12 @@ PHP_FUNCTION(xml_set_processing_instruction_handler)
 PHP_FUNCTION(xml_set_default_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->defaultHandler, hdl TSRMLS_CC);
        XML_SetDefaultHandler(parser->parser, _xml_defaultHandler);
@@ -1455,13 +1448,13 @@ PHP_FUNCTION(xml_set_default_handler)
 PHP_FUNCTION(xml_set_unparsed_entity_decl_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->unparsedEntityDeclHandler, hdl TSRMLS_CC);
        XML_SetUnparsedEntityDeclHandler(parser->parser, _xml_unparsedEntityDeclHandler);
@@ -1474,12 +1467,12 @@ PHP_FUNCTION(xml_set_unparsed_entity_decl_handler)
 PHP_FUNCTION(xml_set_notation_decl_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->notationDeclHandler, hdl TSRMLS_CC);
        XML_SetNotationDeclHandler(parser->parser, _xml_notationDeclHandler);
@@ -1492,12 +1485,12 @@ PHP_FUNCTION(xml_set_notation_decl_handler)
 PHP_FUNCTION(xml_set_external_entity_ref_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->externalEntityRefHandler, hdl TSRMLS_CC);
        XML_SetExternalEntityRefHandler(parser->parser, (void *) _xml_externalEntityRefHandler);
@@ -1510,13 +1503,13 @@ PHP_FUNCTION(xml_set_external_entity_ref_handler)
 PHP_FUNCTION(xml_set_start_namespace_decl_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->startNamespaceDeclHandler, hdl TSRMLS_CC);
        XML_SetStartNamespaceDeclHandler(parser->parser, _xml_startNamespaceDeclHandler);
@@ -1529,13 +1522,13 @@ PHP_FUNCTION(xml_set_start_namespace_decl_handler)
 PHP_FUNCTION(xml_set_end_namespace_decl_handler)
 {
        xml_parser *parser;
-       zval **pind, **hdl;
+       zval *pind, **hdl;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &pind, &hdl) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        xml_set_handler(&parser->endNamespaceDeclHandler, hdl TSRMLS_CC);
        XML_SetEndNamespaceDeclHandler(parser->parser, _xml_endNamespaceDeclHandler);
@@ -1548,26 +1541,18 @@ PHP_FUNCTION(xml_set_end_namespace_decl_handler)
 PHP_FUNCTION(xml_parse)
 {
        xml_parser *parser;
-       zval **pind, **data, **final;
-       int argc, isFinal, ret;
-
-       argc = ZEND_NUM_ARGS();
-       if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &pind, &data, &final) == FAILURE) {
-               WRONG_PARAM_COUNT;
-       }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
-
-       convert_to_string_ex(data);
+       zval *pind;
+       char *data;
+       int data_len, ret;
+       long isFinal = 0;
 
-       if (argc == 3) {
-               convert_to_long_ex(final);
-               isFinal = Z_LVAL_PP(final);
-       } else {
-               isFinal = 0;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|l", &pind, &data, &data_len, &isFinal) == FAILURE) {
+               return;
        }
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        parser->isparsing = 1;
-       ret = XML_Parse(parser->parser, Z_STRVAL_PP(data), Z_STRLEN_PP(data), isFinal);
+       ret = XML_Parse(parser->parser, data, data_len, isFinal);
        parser->isparsing = 0;
        RETVAL_LONG(ret);
 }
@@ -1580,25 +1565,30 @@ PHP_FUNCTION(xml_parse)
 PHP_FUNCTION(xml_parse_into_struct)
 {
        xml_parser *parser;
-       zval **pind, **data, **xdata, **info = 0;
-       int ret;
+       zval *pind, **xdata, **info = NULL;
+       char *data;
+       int data_len, ret;
 
-       if (zend_get_parameters_ex(4, &pind, &data, &xdata,&info) == SUCCESS) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsZ|Z", &pind, &data, &data_len, &xdata, &info) == FAILURE) {
+               return;
+       }
+
+       if (info) {     
                zval_dtor(*info);
                array_init(*info);
-       } else if (zend_get_parameters_ex(3, &pind, &data, &xdata) == FAILURE) {
-               WRONG_PARAM_COUNT;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
-       convert_to_string_ex(data);
        zval_dtor(*xdata);
        array_init(*xdata);
 
        parser->data = *xdata;
-       if (info)
-         parser->info = *info;
+       
+       if (info) {
+               parser->info = *info;
+       }
+
        parser->level = 0;
        parser->ltags = safe_emalloc(XML_MAXLEVEL, sizeof(char *), 0);
 
@@ -1607,7 +1597,7 @@ PHP_FUNCTION(xml_parse_into_struct)
        XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler);
 
        parser->isparsing = 1;
-       ret = XML_Parse(parser->parser, Z_STRVAL_PP(data), Z_STRLEN_PP(data), 1);
+       ret = XML_Parse(parser->parser, data, data_len, 1);
        parser->isparsing = 0;
 
        RETVAL_LONG(ret);
@@ -1619,12 +1609,12 @@ PHP_FUNCTION(xml_parse_into_struct)
 PHP_FUNCTION(xml_get_error_code)
 {
        xml_parser *parser;
-       zval **pind;
+       zval *pind;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &pind) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        RETVAL_LONG((long)XML_GetErrorCode(parser->parser));
 }
@@ -1634,14 +1624,14 @@ PHP_FUNCTION(xml_get_error_code)
    Get XML parser error string */
 PHP_FUNCTION(xml_error_string)
 {
-       zval **code;
+       long code;
        char *str;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &code) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &code) == FAILURE) {
+               return;
        }
-       convert_to_long_ex(code);
-       str = (char *)XML_ErrorString((int)Z_LVAL_PP(code));
+
+       str = (char *)XML_ErrorString((int)code);
        if (str) {
                RETVAL_STRING(str, 1);
        }
@@ -1653,12 +1643,12 @@ PHP_FUNCTION(xml_error_string)
 PHP_FUNCTION(xml_get_current_line_number)
 {
        xml_parser *parser;
-       zval **pind;
+       zval *pind;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &pind) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        RETVAL_LONG(XML_GetCurrentLineNumber(parser->parser));
 }
@@ -1669,12 +1659,12 @@ PHP_FUNCTION(xml_get_current_line_number)
 PHP_FUNCTION(xml_get_current_column_number)
 {
        xml_parser *parser;
-       zval **pind;
+       zval *pind;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &pind) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        RETVAL_LONG(XML_GetCurrentColumnNumber(parser->parser));
 }
@@ -1685,12 +1675,12 @@ PHP_FUNCTION(xml_get_current_column_number)
 PHP_FUNCTION(xml_get_current_byte_index)
 {
        xml_parser *parser;
-       zval **pind;
+       zval *pind;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &pind) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        RETVAL_LONG(XML_GetCurrentByteIndex(parser->parser));
 }
@@ -1700,14 +1690,14 @@ PHP_FUNCTION(xml_get_current_byte_index)
    Free an XML parser */
 PHP_FUNCTION(xml_parser_free)
 {
-       zval **pind;
+       zval *pind;
        xml_parser *parser;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &pind) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pind) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
        if (parser->isparsing == 1) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parser cannot be freed while it is parsing");
@@ -1727,16 +1717,15 @@ PHP_FUNCTION(xml_parser_free)
 PHP_FUNCTION(xml_parser_set_option)
 {
        xml_parser *parser;
-       zval **pind, **opt, **val;
+       zval *pind, **val;
+       long opt;
 
-       if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &pind, &opt, &val) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlZ", &pind, &opt, &val) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
-
-       convert_to_long_ex(opt);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
-       switch (Z_LVAL_PP(opt)) {
+       switch (opt) {
                case PHP_XML_OPTION_CASE_FOLDING:
                        convert_to_long_ex(val);
                        parser->case_folding = Z_LVAL_PP(val);
@@ -1774,16 +1763,15 @@ PHP_FUNCTION(xml_parser_set_option)
 PHP_FUNCTION(xml_parser_get_option)
 {
        xml_parser *parser;
-       zval **pind, **opt;
+       zval *pind;
+       long opt;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &opt) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &pind, &opt) == FAILURE) {
+               return;
        }
-       ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
-
-       convert_to_long_ex(opt);
+       ZEND_FETCH_RESOURCE(parser,xml_parser *, &pind, -1, "XML Parser", le_xml_parser);
 
-       switch (Z_LVAL_PP(opt)) {
+       switch (opt) {
                case PHP_XML_OPTION_CASE_FOLDING:
                        RETURN_LONG(parser->case_folding);
                        break;