OLD | NEW |
1 #define IN_LIBEXSLT | 1 #define IN_LIBEXSLT |
2 #include "libexslt/libexslt.h" | 2 #include "libexslt/libexslt.h" |
3 | 3 |
4 #if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__) | 4 #if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__) |
5 #include <win32config.h> | 5 #include <win32config.h> |
6 #else | 6 #else |
7 #include "config.h" | 7 #include "config.h" |
8 #endif | 8 #endif |
9 | 9 |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 else | 325 else |
326 paramNode = NULL; | 326 paramNode = NULL; |
327 if ((paramNode == NULL) && (func->nargs != 0)) { | 327 if ((paramNode == NULL) && (func->nargs != 0)) { |
328 xsltGenericError(xsltGenericErrorContext, | 328 xsltGenericError(xsltGenericErrorContext, |
329 "exsltFuncFunctionFunction: nargs != 0 and " | 329 "exsltFuncFunctionFunction: nargs != 0 and " |
330 "param == NULL\n"); | 330 "param == NULL\n"); |
331 return; | 331 return; |
332 } | 332 } |
333 | 333 |
334 /* | 334 /* |
| 335 * When a function is called recursively during evaluation of its |
| 336 * arguments, the recursion check in xsltApplySequenceConstructor |
| 337 * isn't reached. |
| 338 */ |
| 339 if (tctxt->depth >= tctxt->maxTemplateDepth) { |
| 340 xsltTransformError(tctxt, NULL, NULL, |
| 341 "exsltFuncFunctionFunction: Potentially infinite recursion " |
| 342 "detected in function {%s}%s.\n", |
| 343 ctxt->context->functionURI, ctxt->context->function); |
| 344 tctxt->state = XSLT_STATE_STOPPED; |
| 345 return; |
| 346 } |
| 347 tctxt->depth++; |
| 348 |
| 349 /* |
335 * We have a problem with the evaluation of function parameters. | 350 * We have a problem with the evaluation of function parameters. |
336 * The original library code did not evaluate XPath expressions until | 351 * The original library code did not evaluate XPath expressions until |
337 * the last moment. After version 1.1.17 of the libxslt, the logic | 352 * the last moment. After version 1.1.17 of the libxslt, the logic |
338 * of other parts of the library was changed, and the evaluation of | 353 * of other parts of the library was changed, and the evaluation of |
339 * XPath expressions within parameters now takes place as soon as the | 354 * XPath expressions within parameters now takes place as soon as the |
340 * parameter is parsed/evaluated (xsltParseStylesheetCallerParam). | 355 * parameter is parsed/evaluated (xsltParseStylesheetCallerParam). |
341 * This means that the parameters need to be evaluated in lexical | 356 * This means that the parameters need to be evaluated in lexical |
342 * order (since a variable is "in scope" as soon as it is declared). | 357 * order (since a variable is "in scope" as soon as it is declared). |
343 * However, on entry to this routine, the values (from the caller) are | 358 * However, on entry to this routine, the values (from the caller) are |
344 * in reverse order (held on the XPath context variable stack). To | 359 * in reverse order (held on the XPath context variable stack). To |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 tctxt->insert = fake; | 421 tctxt->insert = fake; |
407 xsltApplyOneTemplate (tctxt, xmlXPathGetContextNode(ctxt), | 422 xsltApplyOneTemplate (tctxt, xmlXPathGetContextNode(ctxt), |
408 func->content, NULL, NULL); | 423 func->content, NULL, NULL); |
409 xsltLocalVariablePop(tctxt, tctxt->varsBase, -2); | 424 xsltLocalVariablePop(tctxt, tctxt->varsBase, -2); |
410 tctxt->insert = oldInsert; | 425 tctxt->insert = oldInsert; |
411 tctxt->varsBase = oldBase; /* restore original scope */ | 426 tctxt->varsBase = oldBase; /* restore original scope */ |
412 if (params != NULL) | 427 if (params != NULL) |
413 xsltFreeStackElemList(params); | 428 xsltFreeStackElemList(params); |
414 | 429 |
415 if (data->error != 0) | 430 if (data->error != 0) |
416 » return; | 431 goto error; |
417 | 432 |
418 if (data->result != NULL) { | 433 if (data->result != NULL) { |
419 ret = data->result; | 434 ret = data->result; |
420 /* | 435 /* |
421 * IMPORTANT: This enables previously tree fragments marked as | 436 * IMPORTANT: This enables previously tree fragments marked as |
422 * being results of a function, to be garbage-collected after | 437 * being results of a function, to be garbage-collected after |
423 * the calling process exits. | 438 * the calling process exits. |
424 */ | 439 */ |
425 xsltFlagRVTs(tctxt, ret, XSLT_RVT_LOCAL); | 440 xsltFlagRVTs(tctxt, ret, XSLT_RVT_LOCAL); |
426 } else | 441 } else |
427 ret = xmlXPathNewCString(""); | 442 ret = xmlXPathNewCString(""); |
428 | 443 |
429 data->result = oldResult; | 444 data->result = oldResult; |
430 | 445 |
431 /* | 446 /* |
432 * It is an error if the instantiation of the template results in | 447 * It is an error if the instantiation of the template results in |
433 * the generation of result nodes. | 448 * the generation of result nodes. |
434 */ | 449 */ |
435 if (fake->children != NULL) { | 450 if (fake->children != NULL) { |
436 #ifdef LIBXML_DEBUG_ENABLED | 451 #ifdef LIBXML_DEBUG_ENABLED |
437 xmlDebugDumpNode (stderr, fake, 1); | 452 xmlDebugDumpNode (stderr, fake, 1); |
438 #endif | 453 #endif |
439 xsltGenericError(xsltGenericErrorContext, | 454 xsltGenericError(xsltGenericErrorContext, |
440 "{%s}%s: cannot write to result tree while " | 455 "{%s}%s: cannot write to result tree while " |
441 "executing a function\n", | 456 "executing a function\n", |
442 ctxt->context->functionURI, ctxt->context->function); | 457 ctxt->context->functionURI, ctxt->context->function); |
443 xmlFreeNode(fake); | 458 xmlFreeNode(fake); |
444 » return; | 459 » goto error; |
445 } | 460 } |
446 xmlFreeNode(fake); | 461 xmlFreeNode(fake); |
447 valuePush(ctxt, ret); | 462 valuePush(ctxt, ret); |
| 463 |
| 464 error: |
| 465 tctxt->depth--; |
448 } | 466 } |
449 | 467 |
450 | 468 |
451 static void | 469 static void |
452 exsltFuncFunctionComp (xsltStylesheetPtr style, xmlNodePtr inst) { | 470 exsltFuncFunctionComp (xsltStylesheetPtr style, xmlNodePtr inst) { |
453 xmlChar *name, *prefix; | 471 xmlChar *name, *prefix; |
454 xmlNsPtr ns; | 472 xmlNsPtr ns; |
455 xmlHashTablePtr data; | 473 xmlHashTablePtr data; |
456 exsltFuncFunctionData *func; | 474 exsltFuncFunctionData *func; |
457 | 475 |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 (xsltStyleExtShutdownFunction) exsltFuncStyleShutdown); | 786 (xsltStyleExtShutdownFunction) exsltFuncStyleShutdown); |
769 | 787 |
770 xsltRegisterExtModuleTopLevel ((const xmlChar *) "function", | 788 xsltRegisterExtModuleTopLevel ((const xmlChar *) "function", |
771 EXSLT_FUNCTIONS_NAMESPACE, | 789 EXSLT_FUNCTIONS_NAMESPACE, |
772 exsltFuncFunctionComp); | 790 exsltFuncFunctionComp); |
773 xsltRegisterExtModuleElement ((const xmlChar *) "result", | 791 xsltRegisterExtModuleElement ((const xmlChar *) "result", |
774 EXSLT_FUNCTIONS_NAMESPACE, | 792 EXSLT_FUNCTIONS_NAMESPACE, |
775 (xsltPreComputeFunction)exsltFuncResultComp, | 793 (xsltPreComputeFunction)exsltFuncResultComp, |
776 (xsltTransformFunction) exsltFuncResultElem); | 794 (xsltTransformFunction) exsltFuncResultElem); |
777 } | 795 } |
OLD | NEW |