21
21
22
22
#include "php.h"
23
23
#include "php_xsl.h"
24
+ #include <libxslt/variables.h>
24
25
#include "ext/libxml/php_libxml.h"
25
26
26
- /* {{{ php_xsl_xslt_string_to_xpathexpr()
27
- Translates a string to a XPath Expression */
28
- static char * php_xsl_xslt_string_to_xpathexpr (const char * str )
29
- {
30
- const xmlChar * string = (const xmlChar * )str ;
31
-
32
- xmlChar * value ;
33
- int str_len ;
34
27
35
- str_len = xmlStrlen (string ) + 3 ;
36
-
37
- if (xmlStrchr (string , '"' )) {
38
- if (xmlStrchr (string , '\'' )) {
39
- php_error_docref (NULL , E_WARNING , "Cannot create XPath expression (string contains both quote and double-quotes)" );
40
- return NULL ;
41
- }
42
- value = (xmlChar * ) safe_emalloc (str_len , sizeof (xmlChar ), 0 );
43
- snprintf ((char * )value , str_len , "'%s'" , string );
44
- } else {
45
- value = (xmlChar * ) safe_emalloc (str_len , sizeof (xmlChar ), 0 );
46
- snprintf ((char * )value , str_len , "\"%s\"" , string );
47
- }
48
- return (char * ) value ;
49
- }
50
- /* }}} */
51
-
52
- /* {{{ php_xsl_xslt_make_params()
53
- Translates a PHP array to a libxslt parameters array */
54
- static char * * php_xsl_xslt_make_params (HashTable * parht , int xpath_params )
28
+ static zend_result php_xsl_xslt_apply_params (xsltTransformContextPtr ctxt , HashTable * params )
55
29
{
56
-
57
- int parsize ;
58
- zval * value ;
59
- char * xpath_expr ;
60
30
zend_string * string_key ;
61
- char * * params = NULL ;
62
- int i = 0 ;
63
-
64
- parsize = (2 * zend_hash_num_elements (parht ) + 1 ) * sizeof (char * );
65
- params = (char * * )safe_emalloc ((2 * zend_hash_num_elements (parht ) + 1 ), sizeof (char * ), 0 );
66
- memset ((char * )params , 0 , parsize );
31
+ zval * value ;
67
32
68
- ZEND_HASH_MAP_FOREACH_STR_KEY_VAL (parht , string_key , value ) {
33
+ ZEND_HASH_MAP_FOREACH_STR_KEY_VAL (params , string_key , value ) {
69
34
ZEND_ASSERT (string_key != NULL );
70
- if (Z_TYPE_P (value ) != IS_STRING ) {
71
- if (!try_convert_to_string (value )) {
72
- efree (params );
73
- return NULL ;
74
- }
75
- }
35
+ /* Already a string because of setParameter() */
36
+ ZEND_ASSERT (Z_TYPE_P (value ) == IS_STRING );
76
37
77
- if (!xpath_params ) {
78
- xpath_expr = php_xsl_xslt_string_to_xpathexpr (Z_STRVAL_P (value ));
79
- } else {
80
- xpath_expr = estrndup (Z_STRVAL_P (value ), Z_STRLEN_P (value ));
81
- }
82
- if (xpath_expr ) {
83
- params [i ++ ] = estrndup (ZSTR_VAL (string_key ), ZSTR_LEN (string_key ));
84
- params [i ++ ] = xpath_expr ;
38
+ int result = xsltQuoteOneUserParam (ctxt , (const xmlChar * ) ZSTR_VAL (string_key ), (const xmlChar * ) Z_STRVAL_P (value ));
39
+ if (result < 0 ) {
40
+ php_error_docref (NULL , E_WARNING , "Could not apply parameter '%s'" , ZSTR_VAL (string_key ));
41
+ return FAILURE ;
85
42
}
86
43
} ZEND_HASH_FOREACH_END ();
87
44
88
- params [i ++ ] = NULL ;
89
-
90
- return params ;
45
+ return SUCCESS ;
91
46
}
92
- /* }}} */
93
47
94
48
static void xsl_ext_function_php (xmlXPathParserContextPtr ctxt , int nargs , int type ) /* {{{ */
95
49
{
@@ -402,8 +356,6 @@ static xmlDocPtr php_xsl_apply_stylesheet(zval *id, xsl_object *intern, xsltStyl
402
356
xmlNodePtr node = NULL ;
403
357
xsltTransformContextPtr ctxt ;
404
358
php_libxml_node_object * object ;
405
- char * * params = NULL ;
406
- int clone ;
407
359
zval * doXInclude , rv ;
408
360
zend_string * member ;
409
361
FILE * f ;
@@ -440,10 +392,6 @@ static xmlDocPtr php_xsl_apply_stylesheet(zval *id, xsl_object *intern, xsltStyl
440
392
f = NULL ;
441
393
}
442
394
443
- if (intern -> parameter ) {
444
- params = php_xsl_xslt_make_params (intern -> parameter , 0 );
445
- }
446
-
447
395
intern -> doc = emalloc (sizeof (php_libxml_node_object ));
448
396
memset (intern -> doc , 0 , sizeof (php_libxml_node_object ));
449
397
@@ -459,6 +407,13 @@ static xmlDocPtr php_xsl_apply_stylesheet(zval *id, xsl_object *intern, xsltStyl
459
407
ctxt = xsltNewTransformContext (style , doc );
460
408
ctxt -> _private = (void * ) intern ;
461
409
410
+ if (intern -> parameter ) {
411
+ zend_result status = php_xsl_xslt_apply_params (ctxt , intern -> parameter );
412
+ if (UNEXPECTED (status != SUCCESS ) && EG (exception )) {
413
+ goto out ;
414
+ }
415
+ }
416
+
462
417
member = ZSTR_INIT_LITERAL ("doXInclude" , 0 );
463
418
doXInclude = zend_std_read_property (Z_OBJ_P (id ), member , BP_VAR_IS , NULL , & rv );
464
419
if (Z_TYPE_P (doXInclude ) != IS_NULL ) {
@@ -506,8 +461,10 @@ static xmlDocPtr php_xsl_apply_stylesheet(zval *id, xsl_object *intern, xsltStyl
506
461
if (secPrefsError == 1 ) {
507
462
php_error_docref (NULL , E_WARNING , "Can't set libxslt security properties, not doing transformation for security reasons" );
508
463
} else {
509
- newdocp = xsltApplyStylesheetUser (style , doc , ( const char * * ) params , NULL , f , ctxt );
464
+ newdocp = xsltApplyStylesheetUser (style , doc , /* params (handled manually) */ NULL , /* output */ NULL , f , ctxt );
510
465
}
466
+
467
+ out :
511
468
if (f ) {
512
469
fclose (f );
513
470
}
@@ -527,14 +484,6 @@ static xmlDocPtr php_xsl_apply_stylesheet(zval *id, xsl_object *intern, xsltStyl
527
484
efree (intern -> doc );
528
485
intern -> doc = NULL ;
529
486
530
- if (params ) {
531
- clone = 0 ;
532
- while (params [clone ]) {
533
- efree (params [clone ++ ]);
534
- }
535
- efree (params );
536
- }
537
-
538
487
return newdocp ;
539
488
540
489
}
0 commit comments